珂朵莉树求助

P5350 序列

```cpp #include<cstdio> #include<algorithm> #include<vector> #include<set> #define int long long #define p 1000000007 #define ct Chtholly_tree #define Chtholly set<Chtholly_tree>::iterator using namespace std; int n,m; struct Chtholly_tree{ int l,r; mutable int val; ct(int a=-1,int b=-1,int c=0){l=a,r=b,val=c;} bool operator <(const ct &c)const{return l<c.l;} }; set<ct> st; Chtholly split(int pp){ Chtholly it=st.lower_bound(ct(pp)); if(it!=st.end()&&it->l==pp)return it; it--;ct tmp=*it;st.erase(it); st.insert(ct(tmp.l,pp-1,tmp.val)); return st.insert(ct(pp,tmp.r,tmp.val)).first; } int getsum(int l,int r){ Chtholly right=split(r+1),left=split(l); int ans=0; for(;left!=right;left++)ans=(ans+((left->r-left->l+1)*left->val%p))%p; return ans; } void assign(int l,int r,int val){ Chtholly right=split(r+1),left=split(l); st.erase(left,right); st.insert(ct(l,r,val)); } void add(int l,int r,int val){ Chtholly right=split(r+1),left=split(l); for(;left!=right;left++)left->val=(left->val+val)%p; } void copy(int l1,int r1,int l2,int r2){ Chtholly right=split(r1+1),left=split(l1); vector<ct> a; for(;left!=right;left++)a.push_back(*left); Chtholly r=split(r2+1),l=split(l2); st.erase(l,r); for(int i=0;i<a.size();i++)st.insert(ct(l2+a[i].l-l1,l2+a[i].r-l1,a[i].val)); } void rreverse(int l,int r){ Chtholly right=split(r+1),left=split(l); vector<ct> a; for(;left!=right;left++)a.push_back(*left); reverse(a.begin(),a.end());st.erase(left,right); for(int i=0;i<a.size();i++)st.insert(ct(l+r-a[i].r,l+r-a[i].r,a[i].val)); } void swapp(int l1,int r1,int l2,int r2){ Chtholly right=split(r1+1),left=split(l1); vector<ct> a,b;int tot=0; for(;left!=right;left++)a.push_back(*left); Chtholly r=split(r2+1),l=split(l2); for(;l!=r;l++)b.push_back(*l); st.erase(l,r); for(int i=0;i<a.size();i++)st.insert(ct(l2+a[i].l-l1,l2+a[i].r-l1,a[i].val)); right=split(r1+1),left=split(l1); st.erase(left,right); for(int i=0;i<b.size();i++)st.insert(ct(l1+b[i].l-l2,l1+b[i].r-l2,b[i].val)); } signed main(){ scanf("%lld%lld",&n,&m); for(int i=1;i<=n;i++){ int a; scanf("%lld",&a); st.insert(ct(i,i,a)); } for(int i=1;i<=m;i++){ int op,l1,r1,l2,r2,val; scanf("%lld%lld%lld",&op,&l1,&r1); if(op==1)printf("%lld\n",getsum(l1,r1)); if(op==2)scanf("%lld",&val),assign(l1,r1,val); if(op==3)scanf("%lld",&val),add(l1,r1,val); if(op==4)scanf("%lld%lld",&l2,&r2),copy(l1,r1,l2,r2); if(op==5)scanf("%lld%lld",&l2,&r2),swapp(l1,r1,l2,r2); if(op==6)rreverse(l1,r1); } for(Chtholly it=st.begin();it!=st.end()&&it->r<=n;it++){ for(int i=it->l;i<=it->r;i++)printf("%lld ",it->val); } return 0; } ```
by 黑影洞人 @ 2022-07-05 22:42:46


改了第三遍 ```cpp #include<cstdio> #include<algorithm> #include<vector> #include<set> #define int long long #define p 1000000007 #define ct Chtholly_tree #define Chtholly set<Chtholly_tree>::iterator using namespace std; int n,m; struct Chtholly_tree{ int l,r; mutable int val; ct(int a=-1,int b=-1,int c=0){l=a,r=b,val=c;} bool operator <(const ct &c)const{return l<c.l;} }; set<ct> st; Chtholly split(int pp){ Chtholly it=st.lower_bound(ct(pp)); if(it!=st.end()&&it->l==pp)return it; it--;ct tmp=*it;st.erase(it); st.insert(ct(tmp.l,pp-1,tmp.val)); return st.insert(ct(pp,tmp.r,tmp.val)).first; } int getsum(int l,int r){ Chtholly right=split(r+1),left=split(l); int ans=0; for(;left!=right;left++)ans=(ans+((left->r-left->l+1)*left->val%p))%p; return ans; } void assign(int l,int r,int val){ Chtholly right=split(r+1),left=split(l); st.erase(left,right); st.insert(ct(l,r,val)); } void add(int l,int r,int val){ Chtholly right=split(r+1),left=split(l); for(;left!=right;left++)left->val=(left->val+val)%p; } void copy(int l1,int r1,int l2,int r2){ Chtholly right=split(r1+1),left=split(l1); vector<ct> a; for(;left!=right;left++)a.push_back(*left); Chtholly r=split(r2+1),l=split(l2); st.erase(l,r); for(int i=0;i<a.size();i++)st.insert(ct(l2+a[i].l-l1,l2+a[i].r-l1,a[i].val)); } void rreverse(int l,int r){ Chtholly right=split(r+1),left=split(l); vector<ct> a; for(;left!=right;left++)a.push_back(*left); st.erase(left,right); for(int i=0;i<a.size();i++)st.insert(ct(l+r-a[i].r,l+r-a[i].l,a[i].val)); } void swapp(int l1,int r1,int l2,int r2){ Chtholly right=split(r1+1),left=split(l1); vector<ct> a,b; for(;left!=right;left++)a.push_back(*left); st.erase(left,right); Chtholly r=split(r2+1),l=split(l2); for(;l!=r;l++)b.push_back(*l); st.erase(l,r); for(int i=0;i<b.size();i++)st.insert(ct(l1+b[i].l-l2,l1+b[i].r-l2,b[i].val)); for(int i=0;i<a.size();i++)st.insert(ct(l2+a[i].l-l1,l2+a[i].r-l1,a[i].val)); } signed main(){ scanf("%lld%lld",&n,&m); for(int i=1;i<=n;i++){ int a; scanf("%lld",&a); st.insert(ct(i,i,a)); } for(int i=1;i<=m;i++){ int op,l1,r1,l2,r2,val; scanf("%lld%lld%lld",&op,&l1,&r1); if(op==1)printf("%lld\n",getsum(l1,r1)); if(op==2)scanf("%lld",&val),assign(l1,r1,val); if(op==3)scanf("%lld",&val),add(l1,r1,val); if(op==4)scanf("%lld%lld",&l2,&r2),copy(l1,r1,l2,r2); if(op==5)scanf("%lld%lld",&l2,&r2),swapp(l1,r1,l2,r2); if(op==6)rreverse(l1,r1); } for(Chtholly it=st.begin();it!=st.end()&&it->r<=n;it++){ for(int i=it->l;i<=it->r;i++)printf("%lld ",it->val); } return 0; } ```
by 黑影洞人 @ 2022-07-05 22:51:50


AC了,有个疑问,本题珂朵莉树不开O2可以AC吗
by 黑影洞人 @ 2022-07-07 19:02:06


|