社区讨论

这个 #test12 是什么鬼啊

P5494【模板】线段树分裂参与者 5已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@mhjagwro
此快照首次捕获于
2025/11/03 23:22
4 个月前
此快照最后确认于
2025/11/03 23:22
4 个月前
查看原帖
为什么加个 freopen 还能过这个点???
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,tot,ptt,rt[200001],root,p,x,y,t,q,opt;
struct dcz{
	int l,r,v;
}tr[4000001];
int insert(int p,int wh,int val,int l,int r){
	if(!p) p=++tot;
	if(l==r){tr[p].v+=val;return p;}
	int mid=l+r>>1;
	if(wh<=mid) tr[p].l=insert(tr[p].l,wh,val,l,mid);
	else tr[p].r=insert(tr[p].r,wh,val,mid+1,r);
	tr[p].v=tr[tr[p].l].v+tr[tr[p].r].v;
	return p;
}
int merge(int p,int q,int l,int r){
	if(!p||!q) return p+q;
	if(l==r){
		tr[p].v+=tr[q].v;
		return p;
	}
	int mid=l+r>>1;
	tr[p].l=merge(tr[p].l,tr[q].l,l,mid);
	tr[p].r=merge(tr[p].r,tr[q].r,mid+1,r);
	tr[p].v=tr[tr[p].l].v+tr[tr[p].r].v;
	return p;
}
int split(int p,int k,int l,int r){
	int q=++tot;
	int mid=l+r>>1;
	if(l==r){tr[q].v=k,tr[p].v-=k;return q;}
	int val=tr[tr[p].l].v;
	if(k<val) tr[q].l=split(tr[p].l,k,l,mid);
	else if(k==val) swap(tr[p].l,tr[q].l);
	else if(k>val) swap(tr[p].l,tr[q].l),tr[q].r=split(tr[p].r,k-val,mid+1,r);
	tr[q].v=tr[tr[q].l].v+tr[tr[q].r].v;
	tr[p].v=tr[tr[p].l].v+tr[tr[p].r].v;
//	cout<<"!"<<l<<' '<<r<<" "<<tr[q].v<<' '<<tr[tr[q].l].v<<' '<<tr[tr[q].r].v<<"\n";
	return q;
}
int faq(int p,int L,int R,int l,int r){
//	cout<<"!!"<<l<<" "<<r<<" "<<tr[p].v<<"\n"; 
	if(L<=l&&r<=R){
		return tr[p].v;
	}
	int mid=l+r>>1,val=0;
	if(L<=mid) val=faq(tr[p].l,L,R,l,mid);
	if(R>mid) val+=faq(tr[p].r,L,R,mid+1,r);
	return val;
}
int rk(int p,int k,int l,int r){
	int mid=l+r>>1;
	if(l==r) return l;
	if(k<=tr[tr[p].l].v) return rk(tr[p].l,k,l,mid);
	else return rk(tr[p].r,k-tr[tr[p].l].v,mid+1,r);
}
signed main(){
	freopen("P5494_1.in","r",stdin);
	freopen("P5494.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>n>>m;
	root=++ptt;
	for(int i=1;i<=n;i++){
		cin>>x;
		if(x) rt[root]=insert(rt[root],i,x,1,n);
	}
	for(int i=1;i<=m;i++){
		cin>>opt;
		if(opt==0){
			cin>>p>>x>>y;
			int vx=faq(rt[p],1,y,1,n),vy=faq(rt[p],x,y,1,n);
//			cout<<"?"<<vx<<' '<<vy<<"\n"; 
			int fx=split(rt[p],vx-vy,1,n);
//			cout<<"!?"<<tr[rt[p]].v<<'\n';
			rt[++ptt]=split(rt[p],vy,1,n);
//			cout<<"!!?"<<tr[rt[p]].v<<' '<<tr[rt[ptt]].v<<"\n";
			rt[p]=merge(rt[p],fx,1,n);
//			cout<<tr[rt[p]].v<<' '<<tr[rt[ptt]].v<<"\n";
		}
		if(opt==1){
			cin>>p>>t;
			rt[p]=merge(rt[p],rt[t],1,n);
		}
		if(opt==2){
			cin>>p>>x>>q;
			rt[p]=insert(rt[p],q,x,1,n);
		}
		if(opt==3){
			cin>>p>>x>>y;
			cout<<faq(rt[p],x,y,1,n)<<"\n";
		}
		if(opt==4){
			cin>>p>>x;
			if(tr[rt[p]].v<x) cout<<-1<<"\n";
			else cout<<rk(rt[p],x,1,n)<<"\n";
		}
	}
	return 0;
}

回复

5 条回复,欢迎继续交流。

正在加载回复...