P3792

STL 大法好!

常见套路1:区间没有相同元素->\(\min\limits_{l<=i<=r}(suf_{a_i})>r\)

常见套路2:值域上连续一段->\(\max-min=r-l\)

因为带修,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;
}
posted @ 2023-01-31 11:27  yinhee  阅读(33)  评论(0)    收藏  举报