FHQ-Treap 求助
查看原帖
FHQ-Treap 求助
759145
lhc0707楼主2024/8/16 23:07

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;
}
2024/8/16 23:07
加载中...