萌新初学Splay,40pts求调
查看原帖
萌新初学Splay,40pts求调
448884
快乐的大童楼主2023/2/8 18:36

RT,仅 AC 测试点 1,3,4,9。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<map>
#include<unordered_map>
#include<vector>
#include<queue>
#include<bitset>
#include<set>
#include<ctime>
#include<random>
#define x1 xx1
#define y1 yy1
#define IOS ios::sync_with_stdio(false)
#define ITIE cin.tie(0);
#define OTIE cout.tie(0);
#define PY puts("Yes")
#define PN puts("No")
#define PW puts("-1")
#define popcount __builtin_popcount
using namespace std;
inline int R(){
	int x=0,f=1;int ch=getchar();
	while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
	while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}return x*f;
}
inline void write(int x){
	if(x<0){x=-x;putchar('-');}
	int y=0;char z[70];
	while(x||!y){z[y++]=x%10+48;x/=10;}
	while(y--)putchar(z[y]);
}
inline void writesp(int x){
	write(x);putchar(32);
}
inline void writeln(int x){
	write(x);putchar(10);
}
#define pii pair<int,int>
#define mp make_pair
#define fi first
#define se second
#define rep(a,b,c) for(int a=b;a<=c;a++)
#define per(a,b,c) for(int a=b;a>=c;a--)
#define reprange(a,b,c,d) for(int a=b;a<=c;a+=d)
#define perrange(a,b,c,d) for(int a=b;a>=c;a-=d)
#define graph(i,j,k,l) for(int i=k[j];i;i=l[i].nxt)
const int maxn=5e5+5,V=1e3+1,VV=0x3f3f3f3f;
int n,q,c[maxn];
struct node{
	int ch[2],fa,siz,val;//这是信息 
	int sum,ans,preans,secans;//这是答案 
	int tagrev,tagsum;//这是标记 
	node(){ans=-VV;}
}a[maxn]; 
queue<int>id;
int rt,cnt;
int lowinf,uppinf;
bool getson(int p){
	return p==a[a[p].fa].ch[1];
}
void pushup(int p){
	a[p].siz=a[a[p].ch[0]].siz+a[a[p].ch[1]].siz+1;
	a[p].sum=a[a[p].ch[0]].sum+a[a[p].ch[1]].sum+a[p].val;
	a[p].preans=max(a[a[p].ch[0]].preans,a[a[p].ch[0]].sum+a[p].val+a[a[p].ch[1]].preans);
	a[p].secans=max(a[a[p].ch[1]].secans,a[a[p].ch[1]].sum+a[p].val+a[a[p].ch[0]].secans);
	a[p].ans=max(max(a[a[p].ch[0]].ans,a[a[p].ch[1]].ans),a[a[p].ch[0]].secans+a[p].val+a[a[p].ch[1]].preans);
}
void Modify(int p,int x){
	a[p].val=x,a[p].sum=x*a[p].siz,a[p].tagsum=x;
	if(x>=0) a[p].preans=a[p].secans=a[p].ans=x*a[p].siz;
	else a[p].preans=a[p].secans=0,a[p].ans=x; 
}
void Modify_Reverse(int p){
	a[p].tagrev^=1;
	swap(a[p].preans,a[p].secans);
	swap(a[p].ch[0],a[p].ch[1]);
}
void pushdown(int p){
	if(p&&a[p].tagsum){
		if(a[p].ch[0]) Modify(a[p].ch[0],a[p].tagsum);
		if(a[p].ch[1]) Modify(a[p].ch[1],a[p].tagsum);
		a[p].tagsum=a[p].tagrev=0;
	}
	if(p&&a[p].tagrev){
		if(a[p].ch[0]) Modify_Reverse(a[p].ch[0]);
		if(a[p].ch[1]) Modify_Reverse(a[p].ch[1]);
		a[p].tagrev=0;
	}
}
void rotate(int x){
	int y=a[x].fa,z=a[y].fa;
//	pushdown(y),pushdown(x);
	int sn=getson(x),sn1=getson(y);
	int t=a[x].ch[sn^1];
	a[x].fa=z,a[y].fa=x;
	if(t) a[t].fa=y;
	if(z) a[z].ch[sn1]=x;
	a[x].ch[sn^1]=y,a[y].ch[sn]=t;
	pushup(y),pushup(x);
}
void splay(int p,int tar){
	while(a[p].fa!=tar){
		int x=a[a[p].fa].fa;
		if(x!=tar) rotate(getson(a[p].fa)==getson(p)?a[p].fa:p);
		rotate(p);
	}
	if(!tar) rt=p;
}
void kill(int p){
	a[p].ch[0]=a[p].ch[1]=a[p].fa=a[p].val=a[p].siz=0;
	a[p].sum=a[p].tagrev=a[p].tagsum=a[p].preans=a[p].secans=0;
	a[p].ans=-VV;
}
int build(int l,int r,int fa){
	if(l>r) return 0; 
	int mid=l+r>>1;
	int p=id.front();id.pop();
	if(c[mid]==V) uppinf=p;
	if(c[mid]==-V) lowinf=p;
	kill(p);
	a[p].fa=fa,a[p].val=c[mid];
	a[p].ch[0]=build(l,mid-1,p);
	a[p].ch[1]=build(mid+1,r,p);
	pushup(p);
	return p;
}
int kth(int k){
	int nw=rt;
	while(nw&&k){
		pushdown(nw);
		if(k<=a[a[nw].ch[0]].siz) nw=a[nw].ch[0];
		else if(k==a[a[nw].ch[0]].siz+1) return nw;
		else k-=a[a[nw].ch[0]].siz+1,nw=a[nw].ch[1];
	}
}
void insert(int x,int k){
	int pp=kth(x+1),p=kth(x+2);
	splay(pp,0);splay(p,pp);
	int u=build(1,k,p);
	a[p].ch[0]=u;
	splay(p,0);
}
void destroy(int p){
	if(!p) return;
	destroy(a[p].ch[0]);
	destroy(a[p].ch[1]);
	kill(p);id.push(p);
}
void Delete(int l,int r){
	int ll=kth(l),rr=kth(r+2);
	splay(ll,0);splay(rr,ll);
	destroy(a[rr].ch[0]);
	a[rr].ch[0]=0;
	splay(rr,0);
}
void makesame(int l,int r,int k){
	int ll=kth(l),rr=kth(r+2);
	splay(ll,0);splay(rr,ll);
	int nw=a[rr].ch[0];
	Modify(nw,k);
	splay(rr,0);
}
void reverse(int l,int r){
	int ll=kth(l),rr=kth(r+2);
	splay(ll,0);splay(rr,ll);
	if(a[a[rr].ch[0]].tagsum) return; 
	Modify_Reverse(a[rr].ch[0]);
	splay(rr,0);
}
int main(){
	n=R(),q=R();rep(i,1,500002)id.push(i);
	rep(i,1,n)c[i+1]=R();c[1]=-V,c[n+2]=V;
	rt=build(1,n+2,0);
	rep(_,1,q){
		string op;int x,y,k;
		cin>>op;
		if(op=="INSERT"){
			x=R(),k=R();rep(i,1,k)c[i]=R();
			insert(x,k);
		}else if(op=="DELETE"){
			x=R(),y=R();
			Delete(x,x+y-1);
		}else if(op=="MAKE-SAME"){
			x=R(),y=R(),k=R();
			makesame(x,x+y-1,k);
		}else if(op=="REVERSE"){
			x=R(),y=R();
			reverse(x,x+y-1);
		}else if(op=="GET-SUM"){
			x=R(),y=R();
			int tmp=x;
			x=kth(x),y=kth(tmp+y+1);
			splay(x,0);splay(y,x);
			writeln(a[a[y].ch[0]].sum);
		}else if(op=="MAX-SUM"){
			splay(lowinf,0);splay(uppinf,lowinf);
			writeln(a[a[uppinf].ch[0]].ans);
		}
	}
}
2023/2/8 18:36
加载中...