FHQ 全 MLE 求助
  • 板块P5350 序列
  • 楼主igAC
  • 当前回复5
  • 已保存回复5
  • 发布时间2024/5/13 19:26
  • 上次更新2024/5/13 21:37:19
查看原帖
FHQ 全 MLE 求助
780168
igAC楼主2024/5/13 19:26

有点奇怪,空间也就开了 10+MB 怎么会 MLE 呢 /yun

#include<map>
#include<set>
#include<queue>
#include<deque>
#include<stack>
#include<ctime>
#include<cmath>
#include<cctype>
#include<bitset>
#include<vector>
#include<cstdio>
#include<random>
#include<climits>
#include<cstring>
#include<iostream>
#include<algorithm>
#define inf 0x3f3f3f3f
#define INF 1e9
#define LLINF 1e18
#define ll long long
#define N 300005
#define Mod 1000000007
#define ls(p) node[p].ls
#define rs(p) node[p].rs
using namespace std;
int read(){
	int x=0,f=1,ch=getchar();
	for(;!isdigit(ch);ch=getchar()) f=(ch=='-')?-1:1;
	for(;isdigit(ch);ch=getchar()) x=(x<<3)+(x<<1)+(ch^48);
	return x*f;
}
void print(int x){
	if(x<0) putchar('-'),x=~(x-1);
	if(x>9) print(x/10);
	putchar(x%10+48);
}
//bool st;
int n,m,rt,tot,lst;
struct FHQ{
	int ls,rs;
	int Size,key;
	int sum,val;
	bool rev;int cov,tag;
}node[N];
int New(int d){
	node[++tot]=(FHQ){0,0,1,rand(),d,d,0,-1,0};
	return tot;
}
void getnew(int p){
	node[p].Size=node[ls(p)].Size+node[rs(p)].Size+1;
	node[p].sum=node[ls(p)].sum+node[rs(p)].sum+node[p].val;
}
void spread(int p){
	if(~node[p].cov){
		if(ls(p)){
			node[ls(p)].cov=node[ls(p)].val=node[p].cov;
			node[ls(p)].sum=((ll)node[ls(p)].Size*node[p].cov)%Mod;
			node[ls(p)].tag=0;
		}
		if(rs(p)){
			node[rs(p)].cov=node[rs(p)].val=node[p].cov;
			node[rs(p)].sum=((ll)node[rs(p)].Size*node[p].cov)%Mod;
			node[rs(p)].tag=0;
		}
		node[p].cov=-1;
	}
	if(node[p].tag){
		if(ls(p)){
			node[ls(p)].val=((ll)node[ls(p)].val+node[p].tag)%Mod;
			node[ls(p)].tag=((ll)node[ls(p)].tag+node[p].tag)%Mod;
			node[ls(p)].sum=((ll)node[ls(p)].sum+(ll)node[ls(p)].Size*node[p].tag)%Mod;
		}
		if(rs(p)){
			node[rs(p)].val=((ll)node[rs(p)].val+node[p].tag)%Mod;
			node[rs(p)].tag=((ll)node[rs(p)].tag+node[p].tag)%Mod;
			node[rs(p)].sum=((ll)node[rs(p)].sum+(ll)node[rs(p)].Size*node[p].tag)%Mod;
		}
		node[p].tag=0;
	}
	if(node[p].rev){
		if(ls(p)){
			swap(ls(ls(p)),rs(ls(p)));
			node[ls(p)].rev^=1;
		}
		if(rs(p)){
			swap(ls(rs(p)),rs(rs(p)));
			node[rs(p)].rev^=1;
		}
		node[p].rev=0;
	}
}
void split(int p,int k,int &x,int &y){
	if(!p){
		x=y=0;
		return;
	}
	spread(p);
	if(node[ls(p)].Size<k){
		x=p;
		split(rs(p),k-node[ls(p)].Size-1,rs(p),y);
		getnew(x);
	}
	else{
		y=p;
		split(ls(p),k,x,ls(p));
		getnew(y);
	}
}
int merge(int x,int y){
	if(!x || !y) return x+y;
	if(node[x].key>node[y].key){
		spread(x);
		rs(x)=merge(rs(x),y);
		getnew(x);return x;
	}
	else{
		spread(y);
		ls(y)=merge(x,ls(y));
		getnew(y);return y;
	}
}
int query(int l,int r){
	int x,y,z;
	split(rt,l-1,x,y);
	split(y,r-l+1,y,z);
	int res=node[y].sum;
	rt=merge(merge(x,y),z);
	return res;
}
void cover(int l,int r,int d){
	int x,y,z;
	split(rt,l-1,x,y);
	split(y,r-l+1,y,z);
	node[y].val=node[y].cov=d,node[y].tag=0;
	node[y].sum=((ll)node[y].Size*d)%Mod;
	rt=merge(merge(x,y),z);
}
void change(int l,int r,int d){
	int x,y,z;
	split(rt,l-1,x,y);
	split(y,r-l+1,y,z);
	node[y].val=((ll)node[y].val+d)%Mod;
	node[y].tag=((ll)node[y].tag+d)%Mod;
	node[y].sum=((ll)node[y].sum+(ll)node[y].Size*d)%Mod;
	rt=merge(merge(x,y),z);
}
void copy(int l1,int r1,int l2,int r2){
	int x1,y1,z1;
	split(rt,l1-1,x1,y1);
	split(y1,r1-l1+1,y1,z1);
	node[++tot]=node[y1];
	rt=merge(merge(x1,y1),z1);
	int x2,y2,z2;
	split(rt,l2-1,x2,y2);
	split(y2,r2-l2+1,y2,z2);
	rt=merge(merge(x2,tot),z2);
}
void Swap(int l1,int r1,int l2,int r2){
	if(r2<l1) swap(l1,l2),swap(r1,r2);
	int a,b,c,d,e;
	split(rt,r2,d,e);
	split(d,l2-1,c,d);
	split(c,r1,b,c);
	split(b,l1-1,a,b);
	rt=merge(merge(merge(merge(a,d),c),b),e);
}
void rever(int l,int r){
	int x,y,z;
	split(rt,l-1,x,y);
	split(y,r-l+1,y,z);
	swap(ls(y),rs(y)),node[y].rev^=1;
	rt=merge(merge(x,y),z);
}
void Print(int p){
	if(!p) return;
	spread(p);
	Print(ls(p));
	printf("%d ",node[p].val);
	Print(rs(p));
}
int main(){
//	bool ed;
	srand(time(NULL));
	n=read(),m=read();
	for(int i=1;i<=n;++i) rt=merge(rt,New(read()));
	while(m--){
		int op=read();
		if(op==1){
			int l=read()^lst,r=read()^lst;
			printf("%d\n",query(l,r));
		}
		if(op==2){
			int l=read()^lst,r=read()^lst,d=read()^lst;
			cover(l,r,d);
		}
		if(op==3){
			int l=read()^lst,r=read()^lst,d=read()^lst;
			change(l,r,d);
		}
		if(op==4){
			int l1=read()^lst,r1=read()^lst,l2=read()^lst,r2=read()^lst;
			copy(l1,r1,l2,r2);
		}
		if(op==5){
			int l1=read()^lst,r1=read()^lst,l2=read()^lst,r2=read()^lst;
			Swap(l1,r1,l2,r2);
		}
		if(op==6){
			int l=read()^lst,r=read()^lst;
			rever(l,r);
		}
	}
	Print(rt);
//	cerr<<(double)(&ed-&st)/1024.0/1024.0; 
	return 0;
}
2024/5/13 19:26
加载中...