P5350 FHQ AC+MLE 30pts 求调
  • 板块灌水区
  • 楼主Zq_water
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/6/19 12:36
  • 上次更新2024/6/19 12:49:09
查看原帖
P5350 FHQ AC+MLE 30pts 求调
895435
Zq_water楼主2024/6/19 12:36
#include<bits/stdc++.h>
#define INF 1e16
#define endl '\n'
#define PI acos(-1)
#define pb push_back
#define mem(x,v) memset(x,v,sizeof x)
using namespace std;
const int N = 4e6+5;
const int MOD = 1e9+7;
inline int read(){
	register int x=0,f=1;register char c=getchar();
	while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();
	return x*f;
}

int n,m,rt,tot,cnt,a[N];
struct FHQ{int ls,rs,val,sum,siz,rev,add,cov,rnd;}t[N];

int New(int x){t[++tot]={0,0,x,x,1,0,0,-1,rand()};return tot;}
int Copy(int x){int rt=New(0);t[rt]=t[x];return rt;}
void Pushup(int u){
	t[u].siz=t[t[u].ls].siz+t[t[u].rs].siz+1;
	t[u].sum=(t[t[u].ls].sum+t[t[u].rs].sum+t[u].val)%MOD;
}
void PushdownReverse(int u){
	swap(t[u].ls,t[u].rs);
	t[u].rev^=1;
}
void PushdownAdd(int u,int k){
	t[u].val=(t[u].val+k)%MOD;
	t[u].add=(t[u].add+k)%MOD;
	t[u].sum=(t[u].sum+k*t[u].siz)%MOD;
}
void PushdownCover(int u,int k){
	t[u].add=0,t[u].cov=k;
	t[u].val=k;
	t[u].sum=(t[u].siz*k)%MOD;
}
void Pushdown(int u){
	if(t[u].cov!=-1||t[u].add||t[u].rev){
		if(t[u].ls)t[u].ls=Copy(t[u].ls);
		if(t[u].rs)t[u].rs=Copy(t[u].rs);
	}
	if(t[u].cov!=-1){
		if(t[u].ls)PushdownCover(t[u].ls,t[u].cov);
		if(t[u].rs)PushdownCover(t[u].rs,t[u].cov);
		t[u].cov=-1;
	}
	if(t[u].add){
		if(t[u].ls)PushdownAdd(t[u].ls,t[u].add);
		if(t[u].rs)PushdownAdd(t[u].rs,t[u].add);
		t[u].add=0;
	}
	if(t[u].rev){
		if(t[u].ls)PushdownReverse(t[u].ls);
		if(t[u].rs)PushdownReverse(t[u].rs);
		t[u].rev=0;
	}
}
void split(int u,int k,int &x,int &y){
	if(!u){x=y=0;return;}
	Pushdown(u);
	if(t[t[u].ls].siz+1<=k){
		x=Copy(u);
		split(t[x].rs,k-t[t[x].ls].siz-1,t[x].rs,y);
		Pushup(x);
	}
	else{
		y=Copy(u);
		split(t[y].ls,k,x,t[y].ls);
		Pushup(y);
	}
}
int merge(int x,int y){
	if(!x||!y)return x+y;
	if(t[x].rnd<=t[y].rnd){
		Pushdown(x),x=Copy(x);
		t[x].rs=merge(t[x].rs,y);
		Pushup(x);return x;
	}
	else{
		Pushdown(y),y=Copy(y);
		t[y].ls=merge(x,t[y].ls);
		Pushup(y);return y;
	}
}
int query(int l,int r){
	int x,y,z,ans;
	split(rt,r,y,z),split(y,l-1,x,y);
	ans=t[y].sum;
	rt=merge(merge(x,y),z);
	return ans;
}
void cover(int l,int r,int k){
	int x,y,z;
	split(rt,r,y,z),split(y,l-1,x,y);
	y=Copy(y),PushdownCover(y,k);
	rt=merge(merge(x,y),z);
}
void add(int l,int r,int k){
	int x,y,z;
	split(rt,r,y,z),split(y,l-1,x,y);
	y=Copy(y),PushdownAdd(y,k);
	rt=merge(merge(x,y),z);
}
void copy(int l1,int r1,int l2,int r2){
	int v,w,x,y,z,fl=0;
	if(l1>l2)swap(l1,l2),swap(r1,r2),fl=1;
	split(rt,r2,y,z);
	split(y,l2-1,x,y);
	split(x,r1,w,x);
	split(w,l1-1,v,w);
	if(fl)w=Copy(y);
	else y=Copy(w);
	rt=merge(merge(merge(v,w),x),merge(y,z));
}
void swap(int l1,int r1,int l2,int r2){
	int v,w,x,y,z;
	if(l1>l2)swap(l1,l2),swap(r1,r2);
	split(rt,r2,y,z);
	split(y,l2-1,x,y);
	split(x,r1,w,x);
	split(w,l1-1,v,w);
	rt=merge(merge(merge(v,y),x),merge(w,z));
}
void reverse(int l,int r){
	int x,y,z;
	split(rt,r,y,z),split(y,l-1,x,y);
	y=Copy(y),PushdownReverse(y);
	rt=merge(merge(x,y),z);
}
void dfs(int u){
	Pushdown(u);
	if(t[u].ls)dfs(t[u].ls);
	a[++cnt]=t[u].val;
	if(t[u].rs)dfs(t[u].rs);
}
int build(int l,int r){
	if(l>r)return 0;
	int mid=l+r>>1,u=New(a[mid]);
	t[u].ls=build(l,mid-1);
	t[u].rs=build(mid+1,r);
	Pushup(u);return u;
}
void Print(){
	cnt=0,dfs(rt);
	for(int i=1;i<=n;i++)cout<<a[i]<<" ";
	cout<<endl;
}

signed main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>a[i];
	rt=build(1,n);
//	Print();
	for(int i=1,op,l1,r1,l2,r2,k;i<=m;i++){
		cin>>op;
		if(op==1)cin>>l1>>r1,cout<<query(l1,r1)<<endl;
		if(op==2)cin>>l1>>r1>>k,cover(l1,r1,k);
		if(op==3)cin>>l1>>r1>>k,add(l1,r1,k);
		if(op==4)cin>>l1>>r1>>l2>>r2,copy(l1,r1,l2,r2);
		if(op==5)cin>>l1>>r1>>l2>>r2,swap(l1,r1,l2,r2);
		if(op==6)cin>>l1>>r1,reverse(l1,r1);
//		Print();
		if(tot>3600000)cnt=0,dfs(rt),rt=tot=0,rt=build(1,n);
	}
	Print();
	return 0;
}
2024/6/19 12:36
加载中...