萌新求助fhq-treap板题10ptsWA
查看原帖
萌新求助fhq-treap板题10ptsWA
475112
MarSer020楼主2023/12/25 19:58

rt,初步推断为答案会随着树的形态发生改变

code:

#include<bits/stdc++.h>
using namespace std;
int n,q,tot,rt,del[5000005],cnt,a[5000005],k,pos,val,x,y;
string op;
mt19937 gen(random_device{}());
uniform_int_distribution<int>rng(1,0x3f3f3f3f);
struct node{
	int val,siz,lc,rc,rnk,rev,cov,sum,mx,lmx,rmx;
}t[5000005];
void update(int cur){
	t[cur].siz=t[t[cur].lc].siz+t[t[cur].rc].siz+1,
	t[cur].sum=t[t[cur].lc].sum+t[t[cur].rc].sum+t[cur].val,
	t[cur].mx=max(t[t[cur].lc].rmx+t[t[cur].rc].lmx,0)+t[cur].val,
	t[cur].lmx=max(max(t[t[cur].lc].lmx,t[t[cur].lc].sum+t[cur].val+t[t[cur].rc].lmx),0),
	t[cur].rmx=max(max(t[t[cur].rc].rmx,t[t[cur].rc].sum+t[cur].val+t[t[cur].lc].rmx),0);
	if(t[cur].lc)
		t[cur].mx=max(t[cur].mx,t[t[cur].lc].mx);
	if(t[cur].rc)
		t[cur].mx=max(t[cur].mx,t[t[cur].rc].mx);
}
int add(int val){
	int id=(cnt?del[cnt--]:++tot);
	node ret=(node){val,1,0,0,rng(gen),0,0,val,val,max(val,0),max(val,0)};
	t[id]=ret;
	return id;
}
void cover(int cur,int val){
	t[cur].val=val,t[cur].cov=1,t[cur].sum=val*t[cur].siz,t[cur].mx=max(t[cur].sum,val),t[cur].lmx=t[cur].rmx=max(0,t[cur].sum);
}
void reverse(int cur){
	t[cur].rev=1,swap(t[cur].lc,t[cur].rc),swap(t[cur].lmx,t[cur].rmx);
}
void pushdown(int cur){
	if(t[cur].cov){
		if(t[cur].lc)
			cover(t[cur].lc,t[cur].val);
		if(t[cur].rc)
			cover(t[cur].rc,t[cur].val);
		t[cur].cov=0;
	}
	if(t[cur].rev){
		if(t[cur].lc)
			reverse(t[cur].lc);
		if(t[cur].rc)
			reverse(t[cur].rc);
		t[cur].rev=0;
	}
}
void split(int cur,int &a,int &b,int val){
	if(!cur){
		a=b=0;
		return;
	}
	pushdown(cur);
	if(t[t[cur].lc].siz+1<=val)
		a=cur,split(t[cur].rc,t[cur].rc,b,val-t[t[cur].lc].siz-1);
	else
		b=cur,split(t[cur].lc,a,t[cur].lc,val);
	update(cur);
}
void merge(int &cur,int a,int b){
	if(!a||!b){
		cur=a+b;
		return;
	}
	if(t[a].rnk<t[b].rnk)
		pushdown(a),cur=a,merge(t[cur].rc,t[cur].rc,b);
	else
		pushdown(b),cur=b,merge(t[cur].lc,a,t[cur].lc);
	update(cur);
}
int build(int l,int r){
	if(l==r)
		return add(a[l]);
	int mid=(l+r)>>1,cur=0;
	merge(cur,build(l,mid),build(mid+1,r));
	return cur;
}
void insert(int &cur,int val){
	int a=0,b=0,p=add(val);
	split(cur,a,b,val),merge(a,a,p),merge(cur,a,b);
}
void remove(int cur){
	del[++cnt]=cur;
	if(t[cur].lc)
		remove(t[cur].lc);
	if(t[cur].rc)
		remove(t[cur].rc);
}
void print(int cur){
	pushdown(cur);
	if(t[cur].lc)
		print(t[cur].lc);
	cout<<t[cur].val<<' ';
	if(t[cur].rc)
		print(t[cur].rc);
}
int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0),cin>>n>>q;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	rt=build(1,n);
	while(q--){
		cin>>op;
		if(op=="INSERT"){
			cin>>pos>>k,split(rt,rt,x,pos);
			for(int i=1;i<=k;i++)
				cin>>a[i];
			merge(rt,rt,build(1,k)),merge(rt,rt,x);
		}
		else if(op=="DELETE")
			cin>>pos>>k,split(rt,x,rt,pos-1),split(rt,rt,y,k),remove(rt),merge(rt,x,y);
		else if(op=="MAKE-SAME")
			cin>>pos>>k>>val,split(rt,x,rt,pos-1),split(rt,rt,y,k),cover(rt,val),merge(rt,rt,y),merge(rt,x,rt);
		else if(op=="REVERSE")
			cin>>pos>>k,split(rt,x,rt,pos-1),split(rt,rt,y,k),reverse(rt),merge(rt,rt,y),merge(rt,x,rt);
		else if(op=="GET-SUM")
			cin>>pos>>k,split(rt,x,rt,pos-1),split(rt,rt,y,k),cout<<t[rt].sum<<'\n',merge(rt,rt,y),merge(rt,x,rt);
		else
			cout<<t[rt].mx<<'\n';
	}
	return 0;
}
2023/12/25 19:58
加载中...