Mn Zn 求调
查看原帖
Mn Zn 求调
115857
too_later楼主2021/4/5 11:44

Rt,真的努力调过了,跪求大神。

WA 了 6 个点,都是在 10000+ 行 WA 掉的(我也觉得很神奇)。

#include <bits/stdc++.h>
#define ls ch[p][0]
#define rs ch[p][1]
using namespace std;
const int N=5e5+5,M=4e6+5;
int n,m,rt,tag[N],rev[N],a[N],id[N];
int ch[N][2],fa[N],sz[N],l[N],r[N],ma[N],sum[N],val[N];
int cnt,qhead=1,qtail,q[M];
char c[1000];
inline bool get(int x){ return x==ch[fa[x]][1]; }
inline void maintain(int p){
	sz[p]=sz[ls]+sz[rs]+1;sum[p]=sum[ls]+sum[rs]+val[p];
	ma[p]=r[ls]+l[rs]+val[p];
	l[p]=max(l[ls],sum[ls]+val[p]+l[rs]);
	r[p]=max(r[rs],sum[rs]+val[p]+r[ls]);
	if(ls) ma[p]=max(ma[ls],ma[p]);
	if(rs) ma[p]=max(ma[rs],ma[p]);
}
inline void down(int p){
	if(tag[p]){
		if(ls){
			tag[ls]=val[ls]=tag[p];sum[ls]=sz[ls]*val[ls];
			if(val[ls]>=0) l[ls]=r[ls]=ma[ls]=sum[ls];
			else l[ls]=r[ls]=0,ma[ls]=val[ls];
		}
		if(rs){
			tag[rs]=val[rs]=tag[p];sum[rs]=sz[rs]*val[rs];
			if(val[rs]>=0) l[rs]=r[rs]=ma[rs]=sum[rs];
			else l[rs]=r[rs]=0,ma[rs]=val[rs];
		}
		tag[p]=rev[p]=0;
	}
	if(rev[p]){
		rev[p]=0;
		if(ls) rev[ls]^=1,swap(ch[ls][0],ch[ls][1]),swap(l[ls],r[ls]);
		if(rs) rev[rs]^=1,swap(ch[rs][0],ch[rs][1]),swap(l[rs],r[rs]);
	}
}
inline void rotate(int x){
	int y=fa[x],z=fa[y],k=get(x);if(z)ch[z][ch[z][1]==y]=x;
	fa[ch[y][k]=ch[x][!k]]=y,fa[fa[ch[x][!k]=y]=x]=z;
	maintain(y),maintain(x);if(z) maintain(z);
}
inline void splay(int p,int k){
	for(int f;f=fa[p],f!=k;rotate(p))
		if(fa[f]!=k) rotate(get(f)==get(p)?f:p);
	if(!k) rt=p;
}
inline void recycle(int p){
	q[++qtail]=p;
	if(ls) recycle(ls);
	if(rs) recycle(rs);
	ls=rs=fa[p]=val[p]=l[p]=r[p]=sz[p]=ma[p]=sum[p]=tag[p]=rev[p]=0;
}
inline void build(int L,int R,int p){
	int mid=L+R>>1,now=id[mid];
	if(L>R) return;
	if(L==R){
		val[now]=a[L],fa[now]=id[p],ch[id[p]][L>=p]=now;
		l[now]=r[now]=max(a[L],0),ma[now]=a[L];
		sum[now]=a[L];sz[now]=1;return;
	}
	build(L,mid-1,mid),build(mid+1,R,mid);
	fa[now]=id[p],val[now]=a[mid],ch[id[p]][mid>=p]=now;
	maintain(now);
}
inline int kth(int k){
	int cur=rt;
	while(1){
		down(cur);
		if(ch[cur][0]&&k<=sz[ch[cur][0]])
			cur=ch[cur][0];
		else{
			k-=sz[ch[cur][0]]+1;
			if(k<=0) return cur;
			cur=ch[cur][1];
		}
	}
}
inline void ins(int pos,int tot){
	for(int i=1;i<=tot;i++) scanf("%d",&a[i]);
	for(int i=1;i<=tot;i++){
		if(qhead<=qtail) id[i]=q[qhead++];
		else id[i]=++cnt;
	}
	build(1,tot,0);
	int x=kth(pos),y=kth(pos+1);
	splay(x,0),splay(y,x);
	fa[ch[y][0]=id[tot+1>>1]]=y;maintain(y),maintain(x);
}
inline void del(int pos,int tot){
	int x=kth(pos-1),y=kth(pos+tot);
	splay(x,0),splay(y,x);
	recycle(ch[y][0]);ch[y][0]=0;maintain(y),maintain(x);
}
inline void make_same(int pos,int tot,int c){
	int x=kth(pos-1),y=kth(pos+tot);
	splay(x,0),splay(y,x);
	tag[ch[y][0]]=c;val[ch[y][0]]=c;sum[ch[y][0]]=sz[ch[y][0]]*c;
	if(c>0) l[ch[y][0]]=r[ch[y][0]]=ma[ch[y][0]]=sum[ch[y][0]];
	else l[ch[y][0]]=r[ch[y][0]]=0,ma[ch[y][0]]=c;
	maintain(y),maintain(x);
}
inline void reverse(int pos,int tot){
	int x=kth(pos-1),y=kth(pos+tot);
	splay(x,0),splay(y,x);
	rev[ch[y][0]]^=1;
	swap(ch[ch[y][0]][0],ch[ch[y][0]][1]);
	swap(l[ch[y][0]],r[ch[y][0]]);
	maintain(y),maintain(x);
}
inline int query(int pos,int tot){
	int x=kth(pos-1),y=kth(pos+tot);
	splay(x,0),splay(y,x);
	return sum[ch[y][0]];
}
int main(){
	freopen("P2042_2.in","r",stdin);
	freopen("2.out","w",stdout);
	scanf("%d%d",&n,&m);a[1]=a[n+2]=-1e6;
	for(int i=2;i<=n+1;i++) scanf("%d",&a[i]);
	for(int i=1;i<=n+2;i++) id[i]=++cnt;
	build(1,n+2,0);rt=id[n+3>>1];
	for(int x,y,z,i=1;i<=m;i++){
		scanf("%s",c+1);
		if(c[1]=='I')
			scanf("%d%d",&x,&y),ins(x+1,y);
		else if(c[1]=='D')
			scanf("%d%d",&x,&y),del(x+1,y);
		else if(c[1]=='M'&&c[3]=='K')
			scanf("%d%d%d",&x,&y,&z),make_same(x+1,y,z);
		else if(c[1]=='R')
			scanf("%d%d",&x,&y),reverse(x+1,y);
		else if(c[1]=='G')
			scanf("%d%d",&x,&y),printf("%d\n",query(x+1,y));
		else
			printf("%d\n",ma[rt]);
	}
	return 0;
}

2021/4/5 11:44
加载中...