玄关10分求调
查看原帖
玄关10分求调
1420231
yy0707楼主2024/11/28 22:18
#include<bits/stdc++.h>
using namespace std;
int n,m,pos,tot,c;string s;
mt19937 rng;
struct node{int v,front,back,mx,sum,set,s,p,l,r,rev;}tr[500001];
int cnt,sta[500001],top,root;
int newnode(int v){
	int p;
	if(top)p=sta[--top];
	else p=++cnt;
	tr[p].v=tr[p].front=tr[p].back=tr[p].mx=tr[p].sum=v,
	tr[p].set=-998244353,tr[p].rev=tr[p].l=tr[p].r=0,
	tr[p].s=1,tr[p].p=rng();
	return p;
}void update(int p){
	if(!p)return;
	tr[p].s=tr[tr[p].l].s+tr[tr[p].r].s+1,
	tr[p].sum=tr[tr[p].l].sum+tr[tr[p].r].sum+tr[p].v;
	tr[p].front=max(max(tr[tr[p].l].front,tr[tr[p].l].sum+tr[p].v+tr[tr[p].r].front),0);
	tr[p].back=max(max(tr[tr[p].r].back,tr[tr[p].r].sum+tr[p].v+tr[tr[p].l].back),0);
	tr[p].mx=max(tr[tr[p].l].back+tr[tr[p].r].front,0)+tr[p].v;
	if(tr[p].l)tr[p].mx=max(tr[p].mx,tr[tr[p].l].mx);
	if(tr[p].r)tr[p].mx=max(tr[p].mx,tr[tr[p].r].mx);
}void pushdown(int p){
	if(!p)return;
	if(tr[p].rev){
		if(tr[p].l)tr[tr[p].l].rev^=1;
		if(tr[p].r)tr[tr[p].r].rev^=1;
		swap(tr[p].front,tr[p].back),
		swap(tr[p].l,tr[p].r),
		tr[p].rev=0;
	}if(tr[p].set!=-998244353){
		if(tr[p].l){
			tr[tr[p].l].v=tr[p].set;
			tr[tr[p].l].set=tr[p].set;
			tr[tr[p].l].sum=tr[tr[p].l].s*tr[p].set;
			tr[tr[p].l].front=tr[tr[p].l].back=max(tr[tr[p].l].sum,0);
			tr[tr[p].l].mx=max(tr[tr[p].l].sum,tr[tr[p].l].v);
		}if(tr[p].r){
			tr[tr[p].r].v=tr[p].set;
			tr[tr[p].r].set=tr[p].set;
			tr[tr[p].r].sum=tr[tr[p].r].s*tr[p].set;
			tr[tr[p].r].front=tr[tr[p].r].back=max(tr[tr[p].r].sum,0);
			tr[tr[p].r].mx=max(tr[tr[p].r].sum,tr[tr[p].r].v);
		}tr[p].set=-998244353;
	}update(p);
}void split(int p,int k,int&l,int&r){
	if(!p)return l=r=0,void();
	pushdown(p);
	if(tr[tr[p].l].s+1<=k)l=p,split(tr[p].r,k-tr[tr[p].l].s-1,tr[p].r,r);
	else r=p,split(tr[p].l,k,l,tr[p].l);
	update(p);
}int merge(int l,int r){
	if(!l||!r)return l?l:r;
	pushdown(l),pushdown(r);
	if(tr[l].p>tr[r].p)return tr[l].r=merge(tr[l].r,r),update(l),l;
	return tr[r].l=merge(l,tr[r].l),update(r),r;
}void erase(int p){
	sta[top++]=p;
	if(tr[p].l)erase(tr[p].l);
	if(tr[p].r)erase(tr[p].r);
	tr[p]=node();
}int main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>c,root=merge(root,newnode(c));
	for(int i=1;i<=m;i++){
		cin>>s;
		if(s=="INSERT"){
			cin>>pos>>tot;
			int x=0,y=0;
			split(root,pos,x,y);
			for(int j=1;j<=tot;j++)cin>>c,x=merge(x,newnode(c));
			root=merge(x,y);
		}if(s=="DELETE"){
			cin>>pos>>tot;
			int x=0,y=0,z=0;
			split(root,pos-1,x,y);
			split(y,tot,y,z);
			root=merge(x,z);
			erase(y);
		}if(s=="MAKE-SAME"){
			cin>>pos>>tot>>c;
			int x=0,y=0,z=0;
			split(root,pos-1,x,y);
			split(y,tot,y,z);
			tr[y].set=c,tr[y].v=c;
			root=merge(x,merge(y,z));
		}if(s=="REVERSE"){
			cin>>pos>>tot;
			int x=0,y=0,z=0;
			split(root,pos-1,x,y);
			split(y,tot,y,z);
			tr[y].rev^=1;
			root=merge(x,merge(y,z));
		}if(s=="GET-SUM"){
			cin>>pos>>tot;
			int x=0,y=0,z=0;
			split(root,pos-1,x,y);
			split(y,tot,y,z);
			cout<<tr[y].sum<<'\n';
			root=merge(x,merge(y,z));
		}if(s=="MAX-SUM")cout<<tr[root].mx<<'\n';
	}
}
2024/11/28 22:18
加载中...