社区讨论
这个 #test12 是什么鬼啊
P5494【模板】线段树分裂参与者 5已保存回复 5
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 5 条
- 当前快照
- 1 份
- 快照标识符
- @mhjagwro
- 此快照首次捕获于
- 2025/11/03 23:22 4 个月前
- 此快照最后确认于
- 2025/11/03 23:22 4 个月前
为什么加个
CPPfreopen 还能过这个点???#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 条回复,欢迎继续交流。
正在加载回复...