求调qwq
查看原帖
求调qwq
763878
Jerry_heng楼主2024/1/24 22:09

样例都不过。

#include<bits/stdc++.h>
using namespace std;
int n,m,a[5000010],cnt,rt,p[5000010],r1,r2,r3;
string op;
struct node{
	int ch[2],siz,key,val,cov;
	bool lzy,tag;
	int sum,lmx,rmx,mx;
}tree[5000010];
void reverse(int o){
	if(!o)return;
	swap(tree[o].ch[0],tree[o].ch[1]);
	swap(tree[o].lmx,tree[o].rmx);
	tree[o].lzy^=1;
}
void cover(int o,int x){
	tree[o].key=tree[o].cov=x;tree[o].sum=x*tree[o].siz;
	tree[o].lmx=tree[o].rmx=max(0,tree[o].sum);
	tree[o].mx=max(x,tree[o].sum);tree[o].tag=1;
}
void pushdown(int o){
	if(!o)return;
	if(tree[o].lzy){
		if(tree[o].ch[0])reverse(tree[o].ch[0]);
		if(tree[o].ch[1])reverse(tree[o].ch[1]);
		tree[o].lzy=0;
	}
	if(tree[o].tag){
		if(tree[o].ch[0])cover(tree[o].ch[0],tree[o].cov);
		if(tree[o].ch[1])cover(tree[o].ch[1],tree[o].cov);
		tree[o].cov=tree[o].tag=0;
	}
}
void pushup(int o){
	if(!o)return;
	tree[o].sum=tree[tree[o].ch[0]].sum+tree[tree[o].ch[1]].sum;
	tree[o].siz=tree[tree[o].ch[0]].siz+tree[tree[o].ch[1]].siz+1;
	tree[o].lmx=max(max(tree[tree[o].ch[0]].lmx,tree[tree[o].ch[0]].sum+tree[o].key+tree[tree[o].ch[1]].lmx),0);
	tree[o].rmx=max(max(tree[tree[o].ch[1]].rmx,tree[tree[o].ch[1]].sum+tree[o].key+tree[tree[o].ch[0]].rmx),0);
	tree[o].mx=max(tree[o].key,tree[o].key+tree[tree[o].ch[0]].rmx+tree[tree[o].ch[1]].lmx);
	if(tree[o].ch[0])tree[o].mx=max(tree[o].mx,tree[tree[o].ch[0]].mx);
	if(tree[o].ch[1])tree[o].mx=max(tree[o].mx,tree[tree[o].ch[1]].mx);
}
int set_(int x){
	int id=p[cnt--];
	tree[id].ch[0]=tree[id].ch[1]=tree[id].lzy=tree[id].cov=0;
	tree[id].siz=1;tree[id].key=tree[id].sum=tree[id].mx=x;
	tree[id].val=rand();tree[id].lmx=tree[id].rmx=max(0,x);
	return id;
}
int merge(int x,int y){
	if(!x||!y)return x+y;
	if(tree[x].val>tree[y].val){
		pushdown(x);
		tree[x].ch[1]=merge(tree[x].ch[1],y);
		pushup(x);
		return x;
	}
	else{
		pushdown(y);
		tree[y].ch[0]=merge(x,tree[y].ch[0]);
		pushup(y);
		return y;
	}
}
int build(int l,int r){
	if(l==r){
		return set_(a[l]);
	}
	int mid=(l+r)>>1;
	return merge(build(l,mid),build(mid+1,r));
}
void del(int o){
	if(!o)return;
	p[++cnt]=o;
	if(tree[o].ch[0])del(tree[o].ch[0]);
	if(tree[o].ch[1])del(tree[o].ch[1]);
}
void split(int o,int x,int &l,int &r){
	if(o)pushdown(o);
	else{
		l=r=0;
		return;
	}
	if(tree[tree[o].ch[0]].siz+1<=x){
		l=o;
		split(tree[o].ch[1],x-tree[tree[o].ch[0]].siz-1,tree[l].ch[1],r);
	}
	else{
		r=o;
		split(tree[o].ch[0],x,l,tree[r].ch[0]);
	}
	pushup(o);
}
int main(){
	srand(time(0));
	scanf("%d%d",&n,&m);
	for(int i=1;i<=500000;i++)p[++cnt]=i;
	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
	rt=merge(rt,build(1,n));
	while(m--){
		cin>>op;
		if(op=="INSERT"){
			int len,pos;
			scanf("%d%d",&pos,&len);
			for(int i=1;i<=len;i++)scanf("%d",&a[i]);
			split(rt,pos,r1,r2);
			rt=merge(merge(r1,build(1,len)),r2);
		}
		if(op=="DELETE"){
			int pos,len;
			scanf("%d%d",&pos,&len);
			split(rt,pos-1,r1,r3);
			split(r3,len,r2,r3);
			del(r2);
			rt=merge(r1,r3);
		}
		if(op=="MAKE-SAME"){
			int pos,len,c;
			scanf("%d%d%d",&pos,&len,&c);
			split(rt,pos-1,r1,r3);
			split(r3,len,r2,r3);
			cover(r2,c);
			rt=merge(merge(r1,r2),r3);
		}
		if(op=="REVERSE"){
			int pos,len;
			scanf("%d%d",&pos,&len);
			split(rt,pos-1,r1,r3);
			split(r3,len,r2,r3);
			reverse(r2);
			rt=merge(merge(r1,r2),r3);
		}
		if(op=="GET-SUM"){
			int pos,len;
			scanf("%d%d",&pos,&len);
			split(rt,pos-1,r1,r3);
			split(r3,len,r2,r3);
			printf("%d\n",tree[r2].sum);
			rt=merge(merge(r1,r2),r3);
		}
		if(op=="MAX-SUM"){
			printf("%d\n",tree[rt].mx);
		}
	}
	return 0;
}
2024/1/24 22:09
加载中...