P3792

STL 大法好!

常见套路1:区间没有相同元素->minl<=i<=r(sufai)>r

常见套路2:值域上连续一段->maxmin=rl

因为带修,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 @   yinhee  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!

阅读目录(Content)

此页目录为空

点击右上角即可分享
微信分享提示