rt,调了快有三个月了,答案输出很随机,随缘得 0 分或 10 分,求条。马蜂不是很好看。
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<ctime>
using namespace std;
const int N=500005,Na=-1644;
int rt,a[N];
struct treenode
{
int ls,rs,siz,pri,val;
int mx,zmax,ymax,sum,tag;
bool cov,ver;
}t[N];
int stk[N],top,nodecnt;
int newnode(int v)
{
int p=(top?stk[top--]:++nodecnt);
t[p].ls=t[p].rs=0,t[p].cov=t[p].ver=false;
t[p].mx=t[p].sum=t[p].val=v,t[p].tag=Na;
t[p].zmax=t[p].ymax=max(v,0);
t[p].siz=1,t[p].pri=rand();
return p;
}
void delnode(int p){memset(&t[p],0,sizeof(treenode));}
void pushup(int p)
{
if(!p) return;
t[p].siz=t[t[p].ls].siz+t[t[p].rs].siz+1;
t[p].sum=t[t[p].ls].sum+t[t[p].rs].sum+t[p].val;
t[p].zmax=max(max(t[t[p].ls].zmax,t[t[p].ls].sum+t[t[p].rs].zmax+t[p].val),0);
t[p].ymax=max(max(t[t[p].rs].ymax,t[t[p].rs].sum+t[t[p].ls].ymax+t[p].val),0);
t[p].mx=max(t[p].val,t[t[p].ls].ymax+t[p].val+t[t[p].rs].zmax);
if(t[p].ls) t[p].mx=max(t[p].mx,t[t[p].ls].mx);
if(t[p].rs) t[p].mx=max(t[p].mx,t[t[p].rs].mx);
}
void reverse(int p)
{
if(!p) return;
swap(t[p].ls,t[p].rs),swap(t[p].zmax,t[p].ymax);
t[p].val^=1;
}
void cover(int p,int c)
{
if(!p) return;
t[p].tag=t[p].val=c;
t[p].sum=c*t[p].siz;
t[p].mx=max(c,c*t[p].siz);
t[p].zmax=t[p].ymax=max(t[p].sum,0);
t[p].cov=true;
}
void spread(int p)
{
if(t[p].cov)
{
if(t[p].ls) cover(t[p].ls,t[p].tag);
if(t[p].rs) cover(t[p].rs,t[p].tag);
t[p].cov=false,t[p].tag=Na;
}
if(t[p].ver)
{
if(t[p].ls) reverse(t[p].ls);
if(t[p].rs) reverse(t[p].rs);
t[p].ver=false;
}
}
void spl(int p,int k,int &x,int &y)
{
if(!p) {x=y=0; return;}
int rk=t[t[p].ls].siz+1; spread(p);
if(rk<=k) spl(t[p].rs,k-rk,t[x=p].rs,y);
else spl(t[p].ls,k,x,t[y=p].ls);
pushup(p);
}
int merge(int x,int y)
{
if(!x||!y) return x+y; spread(x),spread(y);
if(t[x].pri<t[y].pri) return t[x].rs=merge(t[x].rs,y),pushup(x),x;
else return t[y].ls=merge(x,t[y].ls),pushup(y),y;
}
int build(int pl,int pr)
{
if(pl>pr) return 0;
if(pl==pr) return newnode(a[pl]);
int mid=(pl+pr)>>1,p=newnode(a[mid]);
t[p].ls=build(pl,mid-1),t[p].rs=build(mid+1,pr);
return pushup(p),p;
}
void del(int p)
{
if(!p) return;
delnode(p); stk[++top]=p;
if(t[p].ls) del(t[p].ls);
if(t[p].rs) del(t[p].rs);
}
int main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
srand(time(NULL)); int n,m; cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i]; rt=build(1,n);
while(m--)
{
string op;cin>>op;
if(op=="INSERT")
{
int x=0,y=0,z=0;
int pos,tot,v; cin>>pos>>tot;
for(int i=1;i<=tot;i++) cin>>a[i];
z=build(1,tot);
spl(rt,pos,x,y);
rt=merge(merge(x,z),y);
}
else if(op=="DELETE")
{
int x=0,y=0,z=0;
int pos,tot; cin>>pos>>tot;
spl(rt,pos-1,x,y); spl(y,tot,z,y);
del(z); rt=merge(x,y);
}
else if(op=="MAKE-SAME")
{
int x=0,y=0,z=0;
int pos,tot,c; cin>>pos>>tot>>c;
spl(rt,pos-1,x,y); spl(y,tot,z,y);
cover(z,c); rt=merge(merge(x,z),y);
}
else if(op=="REVERSE")
{
int x=0,y=0,z=0;
int pos,tot; cin>>pos>>tot;
spl(rt,pos-1,x,y); spl(y,tot,z,y);
reverse(z); rt=merge(merge(x,z),y);
}
else if(op=="GET-SUM")
{
int x=0,y=0,z=0;
int pos,tot; cin>>pos>>tot;
spl(rt,pos-1,x,y); spl(y,tot,z,y);
cout<<t[z].sum<<"\n";
rt=merge(merge(x,z),y);
}
else cout<<t[rt].mx<<"\n";
}
return 0;
}