P3792
STL
大法好!
常见套路1:区间没有相同元素->
常见套路2:值域上连续一段->
因为带修,1
的修改可以用 set
维护。为防止爆空间,用个 map
类似离散化。
其他直接线段树。
1
:
点击查看代码
int u=mp[c[x]],v=mp[y];
st[u].erase(st[u].find(x));
auto nxt=st[v].upper_bound(x);
if(nxt==st[v].end()){
suf[x]=inf;
}else{
suf[x]=*nxt;
}
st[v].insert(x);
c[x]=y;
update(1,n,1,x);
2
:
点击查看代码
if(query(1,n,1,x,y,0)-query(1,n,1,x,y,1)==y-x&&query(1,n,1,x,y,2)>y){
puts("damushen");
}else{
puts("yuanxing");
}
sgt
:
点击查看代码
inline void pushup(int o){
tr[o][0]=max(tr[o<<1][0],tr[o<<1|1][0]);
tr[o][1]=min(tr[o<<1][1],tr[o<<1|1][1]);
tr[o][2]=min(tr[o<<1][2],tr[o<<1|1][2]);
}
void build(int l,int r,int o){
if(l==r){
tr[o][0]=tr[o][1]=c[l];
tr[o][2]=suf[l];
return;
}
int mid=(l+r)>>1;
build(l,mid,o<<1);
build(mid+1,r,o<<1|1);
pushup(o);
}
void update(int l,int r,int o,int x){
if(l==r){
tr[o][0]=tr[o][1]=c[x];
tr[o][2]=suf[x];
return;
}
int mid=(l+r)>>1;
if(x<=mid){
update(l,mid,o<<1,x);
}else{
update(mid+1,r,o<<1|1,x);
}
pushup(o);
}
int query(int l,int r,int o,int x,int y,int op){
if(l>=x&&r<=y){
return tr[o][op];
}
int mid=(l+r)>>1,ret;
if(op){
ret=inf;
}else{
ret=0;
}
if(x<=mid){
int res=query(l,mid,o<<1,x,y,op);
if(op){
ret=min(ret,res);
}else{
ret=max(ret,res);
}
}
if(y>mid){
int res=query(mid+1,r,o<<1|1,x,y,op);
if(op){
ret=min(ret,res);
}else{
ret=max(ret,res);
}
}
return ret;
}