ODT0分求助
  • 板块P5350 序列
  • 楼主Jacky2009
  • 当前回复0
  • 已保存回复0
  • 发布时间2021/11/29 00:10
  • 上次更新2023/11/3 23:18:34
查看原帖
ODT0分求助
499231
Jacky2009楼主2021/11/29 00:10
#include<bits/stdc++.h>
using namespace std;
long long mod =1e9+7;
struct node{
	int l,r;
	mutable long long val;
	node(int L,int R=-1,int v=0):l(L),r(R),val(v){}
	bool operator<(const node o)const{return l<o.l;}
};
set<node>s;
#define IT set<node>::iterator
IT split(int pos){
	IT it=s.lower_bound(node(pos));
	if (it != s.end() && it->l == pos) return it;
	--it;
	node lef=node(it->l,pos-1,it->val);
	node rig=node(pos,it->r,it->val);
	s.erase(it);
	s.insert(lef);
	return s.insert(rig).first;
}
void assign(int l,int r,long long v){
	IT itr=split(r+1),itl=split(l);
	s.erase(itl,itr);
	s.insert(node(l,r,v));
}
int sum(int l ,int r){
	IT itr=split(r+1),itl=split(l);
	long long res=0;
	for(IT i=itl;i!=itr;++i){
		res+=(i->r-i->l+1)*i->val;
		res%=mod;
	}
	return res;
}
void adde(int l,int r,long long v){
		IT itr=split(r+1),itl=split(l);
	for(IT i=itl;i!=itr;++i){
		i->val+=v;
		i->val%=mod;
	}
}
void cp(int l,int r,int l2,int r2){
//	cout<<"Copy"<<l<<" "<<r<<" "<<l2<<" "<<r2<<endl;
	vector<node>li;
	IT itr=split(r+1),itl=split(l);
		for(IT i=itl;i!=itr;++i){
		li.push_back(node(i->l-l+l2,i->r-r+l2,i->val));
	//	printf("Insert a node as %d,%d,%d.\n",i->l-l+l2,i->r-r+l2,i->val);
	}
	itr=split(r2+1),itl=split(l2);
	s.erase(itl,itr);
	for(int i=0;i<li.size();i++){
		
		s.insert(li[i]);}
}
void swape(int l,int r,int l2,int r2){
    if(l>l2){
        swap(l,l2);swap(r,r2);
    }
	vector<node>li,lis;
	IT itr=split(r+1),itl=split(l);
		for(IT i=itl;i!=itr;++i){
		li.push_back(node(i->l-l+l2,i->r-l+l2,i->val));
		
	}
	s.erase(itl,itr);
	IT itr2=split(r2+1),itl2=split(l2);
	
	for(IT i=itl2;i!=itr2;++i){
		lis.push_back(node(i->l-l2+l,i->r-l2+l,i->val));
	
	}

	s.erase(itl2,itr2);
	for(int i=0;i<lis.size();i++){
		s.insert(lis[i]);
	//		printf("Insert a node as %d,%d,%d.\n",lis[i].l,lis[i].r,lis[i].val);
	}
	for(int i=0;i<li.size();i++){
	//	printf("Insert a node as %d,%d,%d.\n",li[i].l,li[i].r,li[i].val);
		 s.insert(li[i]);
	}
}
void flip(int l,int r){
	vector<node>li;
	IT itr=split(r+1),itl=split(l);
	for(IT i=itl;i!=itr;++i){
		li.push_back(node(r-i->r+l,li[i].l,i->val));
	}
	s.erase(itl,itr);
	for(int i=li.size()-1;i>=0;i--){
	//	printf("Fliped node as %d %d %d.\n",li[i].l,li[i].r,li[i].val);
		s.insert(li[i]);
	}
}
int main(){
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		int x;cin>>x;
		s.insert(node(i,i,x));
	}
	s.insert(node(n+1,n+1,1145141919));
	for(int i=1;i<=m;i++){
		for(IT i=s.begin();i!=s.end();++i){
			for(int j=i->l;j<=i->r;j++)cout<<i->val<<" ";
			cout<<" ";
		}
		cout<<endl;
		int op,l,r;
		cin>>op>>l>>r;
		if(op==1){
			cout<<sum(l,r)<<"\n";
		}
		else if(op==2){
			int v;
			cin>>v;
			assign(l,r,v);
		}
		else if(op==3){
			int val;cin>>val;
			adde(l,r,val);
		}
		else if(op==4){
			int l2,r2;cin>>l2>>r2;
			cp(l,r,l2,r2);
		}
		else if(op==5){
			int l2,r2;
			cin>>l2>>r2;
			swape(l,r,l2,r2);
		}
		else if(op==6)flip(l,r);
	}
	for(IT i=s.begin();;++i){
		if(i->val==1145141919)return 0;
		for(int j=i->l;j<=i->r;++j)cout<<i->val<<" ";
	}
}
2021/11/29 00:10
加载中...