关于 ODT
  • 板块灌水区
  • 楼主Aesyl
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/11/20 14:56
  • 上次更新2024/11/20 17:10:31
查看原帖
关于 ODT
1062944
Aesyl楼主2024/11/20 14:56

set 指针总乱飘怎么办QAQ?

#include<bits/stdc++.h>
#define int long long
#define N 10000005
#define M 1000000007
using namespace std;
struct Chtholly{
	int l,r;
	mutable int v;
	Chtholly(int l,int r=-1,int v=-1):l(l),r(r),v(v){}
	bool operator<(const Chtholly &a)const{
		return l<a.l;
	}
}; 
set<Chtholly>s;
int n,m,T,siz[N],val[N],cnt,Siz[N],Val[N],Cnt;
set<Chtholly>::iterator split(int p){
	auto it=s.lower_bound(Chtholly(p));
	if(it!=s.end()&&it->l==p) return it;
	it--;
	if(it->r<p) return s.end();
	int l=it->l,r=it->r,v=it->v;
	s.erase(it);
	s.insert(Chtholly(l,p-1,v));
	return s.insert(Chtholly(p,r,v)).first;
}
void assign(int l,int r,int x){
	auto itr=split(r+1),itl=split(l);
	s.erase(itl,itr);
	s.insert(Chtholly(l,r,x));
}
void add(int l,int r,int x){
	auto itr=split(r+1),itl=split(l);
	for(auto it=itl;it!=itr;it++) it->v+=x,it->v%=M;
}
void cpy(int l,int r,int L,int R){
	auto itr=split(r+1),itl=split(l);
	cnt=0;
	for(auto it=itl;it!=itr;it++) siz[++cnt]=it->r-it->l+1,val[cnt]=it->v;
	itr=split(R+1),itl=split(L);
	s.erase(itl,itr);
	for(int i=1;i<=cnt;i++){
		s.insert(Chtholly(L,L+siz[i]-1,val[i]));
		L+=siz[i];
	}
}
void swp(int l,int r,int L,int R){
	if(l>L) swap(l,L),swap(r,R);
	auto itr=split(r+1),itl=split(l);
	cnt=0;
	for(auto it=itl;it!=itr;it++) siz[++cnt]=it->r-it->l+1,val[cnt]=it->v;
	itr=split(R+1),itl=split(L);
	Cnt=0;
	for(auto it=itl;it!=itr;it++) Siz[++Cnt]=it->r-it->l+1,Val[Cnt]=it->v;
	
	itr=split(r+1),itl=split(l);
	s.erase(itl,itr);
	itr=split(R+1),itl=split(L);
	s.erase(itl,itr);
	for(int i=1;i<=Cnt;i++){
		s.insert(Chtholly(l,l+Siz[i]-1,Val[i]));
		l+=Siz[i];
	}
	for(int i=1;i<=cnt;i++){
		s.insert(Chtholly(L,L+siz[i]-1,val[i]));
		L+=siz[i];
	}
}
void rvs(int l,int r){
	auto itr=split(r+1),itl=split(l);
	cnt=0;
	for(auto it=itl;it!=itr;it++) siz[++cnt]=it->r-it->l+1,val[cnt]=it->v;
	s.erase(itl,itr);
	for(int i=cnt;i;i--){
		s.insert(Chtholly(l,l+siz[i]-1,val[i]));
		l+=siz[i];
	}
}
int solve(int l,int r){
	auto itr=split(r+1),itl=split(l);
	int ret=0;
	for(auto it=itl;it!=itr;it++) ret=(ret+(it->v)*(it->r-it->l+1)%M)%M;
	return ret;
}
signed main(){
	ios::sync_with_stdio(false);
	cin>>n>>m;
	for(int i=1,a;i<=n;i++) cin>>a,s.insert(Chtholly(i,i,a%M));
	int l,r,op,L,R;
	while(m--){
		cin>>op>>l>>r;
		if(op==1) cout<<solve(l,r)<<endl;
		if(op==2) cin>>L,assign(l,r,L);
		if(op==3) cin>>L,add(l,r,L);
		if(op==4) cin>>L>>R,cpy(l,r,L,R);
		if(op==5) cin>>L>>R,swp(l,r,L,R);
		if(op==6) rvs(l,r);
	}
	for(auto it=s.begin();it!=s.end();it++){
		int len=it->r-it->l+1;
		while(len--) cout<<it->v<<" ";
	}
    return 0;
}

在 swap 操作中()

2024/11/20 14:56
加载中...