舅舅孩子 60pts
  • 板块P2710 数列
  • 楼主OYBDOOO
  • 当前回复4
  • 已保存回复4
  • 发布时间2020/6/12 22:02
  • 上次更新2023/11/7 00:46:52
查看原帖
舅舅孩子 60pts
73847
OYBDOOO楼主2020/6/12 22:02

恶心题WA60pts,嘤嘤嘤

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<ctime>
#include<stack>
#include<string>
using namespace std;
const int maxn=5e5;
int taga[maxn];
int tagb[maxn];
int sz[maxn];
int lm[maxn];
int rm[maxn];
int mm[maxn];
int ch[maxn][2];
int val[maxn];
int all[maxn];
int pri[maxn];
int ttt,n,m;
stack<int>st;
int root;
int nnode(int x)
{
	int o;
	if(!st.empty())o=st.top(),st.pop();
	else o=++ttt;
	taga[o]=-10000;
	tagb[o]=0;
	sz[o]=1;
	ch[o][0]=ch[o][1]=0;
	val[o]=x;all[o]=x;mm[o]=x;pri[o]=rand();
	lm[o]=rm[o]=max(x,0);	
	return o;
}
void fz(int x)
{
	if(x==0)return;
	tagb[x]^=1;
	swap(ch[x][0],ch[x][1]);
	swap(lm[x],rm[x]);
}
void fg(int x,int y)
{
	if(x==0)return;
	taga[x]=y;
	val[x]=y;
	all[x]=y*sz[x];
	lm[x]=rm[x]=max(y,0);
	mm[x]=max(val[x],all[x]);
	return;
}
void upd(int x)
{
	if(x==0)return;
	sz[x]=sz[ch[x][0]]+sz[ch[x][1]]+1;
	all[x]=all[ch[x][0]]+all[ch[x][1]]+val[x];
	mm[x]=max(val[x],val[x]+rm[ch[x][0]]+lm[ch[x][1]]);
	if(ch[x][0])mm[x]=max(mm[x],mm[ch[x][0]]);
	if(ch[x][1])mm[x]=max(mm[x],mm[ch[x][1]]);
	lm[x]=max(lm[ch[x][0]],all[ch[x][0]]+val[x]+lm[ch[x][1]]);lm[x]=max(lm[x],0);
	rm[x]=max(rm[ch[x][1]],all[ch[x][1]]+val[x]+rm[ch[x][0]]);rm[x]=max(rm[x],0);
}
void psdo(int x)
{
	int my=-1;
	if(x==0)return;
	
	
	if(taga[x]!=-10000)
	{
		if(ch[x][0])fg(ch[x][0],taga[x]);
		if(ch[x][1])fg(ch[x][1],taga[x]);
		taga[x]=-10000;
	}
	if(tagb[x]!=0)
	{
		if(ch[x][0])fz(ch[x][0]);
		if(ch[x][1])fz(ch[x][1]);
		tagb[x]=0;
	}
}

void split(int now,int k,int &x,int &y)
{
	if(now==0)x=y=0;
	else
	{
		psdo(now);
		if(sz[ch[now][0]]<k)x=now,split(ch[now][1],k-sz[ch[now][0]]-1,ch[now][1],y);
		else y=now,split(ch[now][0],k,x,ch[now][0]);
		upd(now);
	}
}
int merge(int x,int y)
{
	if(x==0||y==0)return x+y;
	psdo(x);psdo(y);
	if(pri[x]<pri[y])
	{
		ch[x][1]=merge(ch[x][1],y);
		upd(x);
		return x;
	}
	else
	{
		ch[y][0]=merge(x,ch[y][0]);
		upd(y);
		return y;
	}
}
void sha(int x)
{
	if(x==0)return;
	st.push(x);
	if(ch[x][0])sha(ch[x][0]);
	ch[x][0]=0;
	if(ch[x][1])sha(ch[x][1]);
	ch[x][1]=0;
	val[x]=0,taga[x]=0,tagb[x]=0;
	mm[x]=0;lm[x]=0;rm[x]=0;
}
void dfs(int x)
{
//	psdo(x);
	if(ch[x][0])dfs(ch[x][0]);
	printf("%d ",val[x]);
	if(ch[x][1])dfs(ch[x][1]);
}
string ss;
int main()
{
	int i,x,ge,oo,a,b,c,d,y;
//	srand(time(0));
	srand(0);
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++)
	{
		scanf("%d",&x);
		root=merge(root,nnode(x));
	}
	int tmp=0;
	for(oo=1;oo<=m;oo++)
	{
		if(oo==82)
			int my=-1;
		cin>>ss;
		if(ss=="INSERT")
		{
			scanf("%d%d",&x,&ge);
			split(root,x,a,b);
			scanf("%d",&y);
			c=nnode(y);
			for(i=2;i<=ge;i++)
			{
				scanf("%d",&y);
				c=merge(c,nnode(y));
			}
			root=merge(merge(a,c),b);
		}
		else if(ss=="DELETE")
		{
			scanf("%d%d",&x,&ge);
			split(root,x-1,a,b);
			split(b,ge,c,d);
			sha(c);
			root=merge(a,d);
		}
		else if(ss=="REVERSE")
		{
			scanf("%d%d",&x,&ge);
			split(root,x-1,a,b);
			split(b,ge,c,d);
			fz(c);
			root=merge(a,merge(c,d));
		}
		else if(ss=="MAKE-SAME")
		{
			scanf("%d%d%d",&x,&ge,&y);
			split(root,x-1,a,b);
			split(b,ge,c,d);
			fg(c,y);
			tagb[c]=0;
			root=merge(a,merge(c,d));
		}
		else if(ss=="GET-SUM")
		{
			scanf("%d%d",&x,&ge);
			split(root,x-1,a,b);
			split(b,ge,c,d);
			cout<<all[c]<<endl;
			root=merge(a,merge(c,d));
			tmp++;
			if(tmp==35)
				int my=-1;
		}
		else if(ss=="GET")
		{
			scanf("%d",&x);
			split(root,x-1,a,b);
			split(b,1,c,d);
			cout<<all[c]<<endl;
			root=merge(a,merge(c,d));
			tmp++;
			if(tmp==35)
				int my=-1;
		}
		else
		{
			scanf("%d%d",&x,&ge);
			split(root,x-1,a,b);
			split(b,ge,c,d);
			cout<<mm[c]<<endl;
			root=merge(a,merge(c,d));
			tmp++;
			if(tmp==35)
				int my=-1;
		}
	//	dfs(root);
		//cout<<endl;
	}
	return 0;
}
2020/6/12 22:02
加载中...