fhq 10 pts求调
查看原帖
fhq 10 pts求调
760655
tkdqmx楼主2024/7/12 20:13
#include<bits/stdc++.h>
using namespace std;
#define N 5000005
struct FHQ_treap{
	int cnt=0,root=0,t[N];
	struct Node{
		int ls,rs,sz;
		int sum,dls,drs,ans;
		int pri,key,tad,taf;
	}tr[N];
	void newnode(int key){
		tr[++cnt]={0,0,1,key,max(key,0),max(key,0),key,rand(),key,0,0};
	}
	void update(int u){
		int ls=tr[u].ls,rs=tr[u].rs;
		tr[u].dls=max({tr[ls].dls,tr[ls].sum+tr[u].key+tr[rs].dls,0});
		tr[u].drs=max({tr[rs].drs,tr[rs].sum+tr[u].key+tr[ls].drs,0});
		tr[u].sz=tr[ls].sz+tr[rs].sz+1,tr[u].sum=tr[u].key+tr[ls].sum+tr[rs].sum;
		tr[u].ans=max({tr[ls].ans,tr[rs].ans,tr[u].key+max(tr[ls].drs+tr[rs].dls,0)});
	}
	void pushdown(int u){
		int &ls=tr[u].ls,&rs=tr[u].rs;
		if(tr[u].taf){
			swap(ls,rs),tr[u].taf=0;
			if(ls)  tr[ls].taf^=1;
			if(rs)  tr[rs].taf^=1;
		}
		if(tr[u].tad){
			if(ls){
				tr[ls].sum=tr[ls].sz*tr[u].key,tr[ls].key=tr[u].key,tr[ls].tad=1;
				tr[ls].dls=tr[ls].drs=max(tr[u].tad,0),tr[ls].ans=max(tr[u].tad,tr[ls].sum);
			}
			if(rs){
				tr[rs].sum=tr[rs].sz*tr[u].key,tr[rs].key=tr[u].key,tr[rs].tad=1;
				tr[rs].dls=tr[rs].drs=max(tr[u].key,0),tr[rs].ans=max(tr[u].key,tr[rs].sum);
			}
			tr[u].tad=0;
		}
	}
	void split(int u,int x,int &L,int &R){
		if(!u)  return L=R=0,void();
		pushdown(u);
		if(tr[tr[u].ls].sz<x)
			L=u,split(tr[u].rs,x-tr[tr[u].ls].sz-1,tr[u].rs,R);
		else
			R=u,split(tr[u].ls,x,L,tr[u].ls);
		update(u);
	}
	int merge(int L,int R){
		if(!L||!R)  return L+R;
		if(tr[L].pri>tr[R].pri){
			pushdown(L),tr[L].rs=merge(tr[L].rs,R);
			return update(L),L;
		}
		pushdown(R),tr[R].ls=merge(L,tr[R].ls);
		return update(R),R;
	}
	int add(int l,int r){
		if(l==r)  return newnode(t[l]),cnt;
		int mid=(l+r)>>1;
		return merge(add(l,mid),add(mid+1,r));
	}
	void insert(int x,int y,int L=0,int R=0,int s=0){
		for(int i=1;i<=y;i++)  scanf("%d",t+i);
		split(root,x,L,R),root=merge(merge(L,add(1,y)),R);
	}
	void erase(int l,int r,int L=0,int p=0,int R=0){
		split(root,l-1,L,p),split(p,r,p,R);
		root=merge(L,R);
	}
	void make_same(int x,int l,int r,int L=0,int p=0,int R=0){
		split(root,l-1,L,p),split(p,r,p,R);
		tr[p].sum=tr[p].sz*x,tr[p].tad=1,tr[p].key=x;
		tr[p].dls=tr[p].drs=max(x,0),tr[p].ans=max(x,tr[p].sum);
		root=merge(merge(L,p),R);
	}
	void reverse(int l,int r,int L=0,int p=0,int R=0){
		split(root,l-1,L,p),split(p,r,p,R);
		tr[p].taf^=1,root=merge(merge(L,p),R);
	}
	int query_sum(int l,int r,int L=0,int p=0,int R=0){
		split(root,l-1,L,p),split(p,r,p,R);
		int res=tr[p].sum;
		return root=merge(merge(L,p),R),res;
	}
}FHQ;
int n,m;
char op[15];
int main(){
	scanf("%d%d",&n,&m),FHQ.insert(0,n);
	for(int i=1,x,y,v;i<=m;i++){
		scanf("%s",op);
		if(op[0]=='I')  scanf("%d%d",&x,&y),FHQ.insert(x,y);
		if(op[0]=='D')  scanf("%d%d",&x,&y),FHQ.erase(x,y);
		if(op[0]=='M'&&op[2]=='K')  scanf("%d%d%d",&x,&y,&v),FHQ.make_same(v,x,y);
		if(op[0]=='R')  scanf("%d%d",&x,&y),FHQ.reverse(x,y);
		if(op[0]=='G')  scanf("%d%d",&x,&y),printf("%d\n",FHQ.query_sum(x,y));
		if(op[0]=='M'&&op[2]=='X')  printf("%d\n",FHQ.tr[FHQ.root].ans);
	}
}
2024/7/12 20:13
加载中...