珂朵莉树求助
  • 板块P5350 序列
  • 楼主黑影洞人
  • 当前回复3
  • 已保存回复3
  • 发布时间2022/7/5 22:35
  • 上次更新2023/10/27 21:47:15
查看原帖
珂朵莉树求助
285617
黑影洞人楼主2022/7/5 22:35
#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;int tot=0;
	for(;left!=right;left++)a.push_back(*left);
	Chtholly r=split(r2+1),l=split(l2);
	st.erase(l,r);
	for(int i=1;i<tot;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=1;i<tot;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=1;i<tot;i++)st.insert(ct(l1+b[i].l-l2,l1+b[i].r-l2,b[i].val));
}
signed main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		int a;
		scanf("%d",&a);
		st.insert(ct(i,i,a));
	}
	for(int i=1;i<=m;i++){
		int op,l1,r1,l2,r2,val;
		scanf("%d%d%d",&op,&l1,&r1);
		if(op==1)printf("%d\n",getsum(l1,r1));
		if(op==2)scanf("%d",&val),assign(l1,r1,val);
		if(op==3)scanf("%d",&val),add(l1,r1,val);
		if(op==4)scanf("%d%d",&l2,&r2),copy(l1,r1,l2,r2);
		if(op==5)scanf("%d%d",&l2,&r2),swapp(l1,r1,l2,r2);
		if(op==6)rreverse(l1,r1);
	}
	Chtholly right=split(n+1),left=split(1);
	for(;left!=right;left++){
		for(int i=left->l;i<=left->r;i++)printf("%d ",left->val);	
	}
	return 0;
}



2022/7/5 22:35
加载中...