全WA求条
查看原帖
全WA求条
966300
Stardust_Mirage楼主2025/7/24 15:07

P5350

#include<bits/stdc++.h>
#define itt set<odt>::iterator
#define int long long
using namespace std;
const int mod=1e9+7;
struct odt{
	int l,r;
	mutable int v;
	bool operator < (const odt &a)const{
		return l<a.l;
	} 
	odt(int L=0,int R=0,int _v=0):l(L),r(R),v(_v){return;}
}a[300005]; 
set<odt>t;int n,q;
inline itt sp(int x){
	itt it=t.lower_bound(odt(x));
	if(it!=t.end()&&it->l==x)return it;
	it--;int l=it->l,r=it->r,v=it->v;
	t.erase(it);t.insert(odt(l,x-1,v));
	return t.insert(odt(x,r,v)).first;
}
inline void ass(int x,int y,int z){
	itt itr=sp(y+1), itl=sp(x);
	t.erase(itl,itr);
	t.insert(odt(x,y,z));
}
inline void add(int x,int y,int z){
	itt itr=sp(y+1),itl=sp(x);
	for(itt it=itl;it!=itr;it++)it->v+=z,it->v%=mod;
}
inline int sum(int x,int y){
	itt itr=sp(y+1),itl=sp(x);
	int res=0;
	for(itt i=itl;i!=itr;i++){
		res+=1ll*(i->v)*(i->r-i->l+1);
		res%=mod;
	}
	return res;
}
inline void copy(int l,int r,int L,int R){
	itt itr1=sp(r+1),itl1=sp(l);
	itt itr=sp(R+1),itl=sp(L);
	t.erase(itl,itr);
	for(itt i=itl1;i!=itr1;i++){
		t.insert(odt(L+i->l-l,L-l+i->r,i->v));
	}
//	tt(n);
}
inline void swa(int l,int r,int L,int R){
	itt itr1=sp(r+1),itl1=sp(l);
	itt itr=sp(R+1),itl=sp(L);
	int len=0;
	for(itt i=itl;i!=itr;i++){
		a[++len].l=i->l;
		a[len].r=i->r;
		a[len].v=i->v;
	}
	t.erase(itl,itr);
	for(itt i=itl1;i!=itr1;i++){
		t.insert(odt(L+i->l-l,L-l+i->r,i->v));
	}
	t.erase(itl1,itr1);
	for(int i=1;i<=len;i++){
		t.insert(odt(a[i].l-L+l,a[i].r-L+l,a[i].v));
	}
}
inline void re(int l,int r){
	itt itr=sp(r+1),itl=sp(l);
	int len=0;
	for(itt i=itl;i!=itr;i++){
		a[++len].l=i->l;
		a[len].r=i->r;
		a[len].v=i->v;
	}
	t.erase(itl,itr);
	for(int i=1;i<=len;i++){
		t.insert(odt(r-a[i].r+l,r-a[i].l+l,a[i].v));
	}
}
void tt(int n){
	itt itl=sp(1),itr=sp(n+1);
	for(itt i=itl;i!=itr;i++){
		for(int j=1;j<=i->r-i->l+1;j++)cout<<i->v%mod<<" ";
	}cout<<"\n";
}
signed main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	cin>>n>>q;
	for(int i=1,x;i<=n;i++){
		cin>>x;
		t.insert(odt(i,i,x));
	}
	t.insert(odt(n+1,n+1,0));
	for(int i=1,op,x,y,z,h;i<=q;i++){
		cin>>op>>x>>y;
		if(x>y)swap(x,y);
		if(op==1){cout<<sum(x,y)<<"\n";}
		if(op==2){cin>>z;ass(x,y,z);}
		if(op==3){cin>>z;add(x,y,z);}
		if(op==4){cin>>z>>h;if(z>h)swap(z,h);if(z>x){swap(z,x);swap(y,h);}copy(x,y,z,h);}
		if(op==5){cin>>z>>h;if(z>h)swap(z,h);if(z>x){swap(z,x);swap(y,h);}swa(x,y,z,h);}
		if(op==6){re(x,y);}
//		cout<<i<<" ";tt(n);
	}
	tt(n);
	return 0;
}
//7 1 3 2 2 4 0 1 2 2 
//7 1 2 2 2 4 0 1 2 2 
//7 1 2 7 7 5 9 6 7 7 
2025/7/24 15:07
加载中...