样例未过,萌新Splay求调
查看原帖
样例未过,萌新Splay求调
711397
AyaAya楼主2022/4/12 21:45
#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=5000005;
const int INF=0x7fffffff/2;
int m;
int _mousePos=2;
int ins[N];
int NumIN;
class Splay
{
	public:
		int prt[N],s[N][2],siz[N];
		int v[N],maxl[N],maxr[N],sum[N],MAX[N];
		int lz[N],c_lz[N];
		int bstsiz;
		int root;
		void pushup(int x)
		{
			#define l(x) s[x][0]
			#define r(x) s[x][1]
			if(!x) return;
			siz[x]=1,sum[x]=v[x];
			if(l(x)) siz[x]+=siz[l(x)],sum[x]+=sum[l(x)];
			if(r(x)) siz[x]+=siz[r(x)],sum[x]+=sum[r(x)];
			maxl[x]=max(maxl[l(x)],sum[l(x)]+v[x]+maxl[r(x)]);
			maxr[x]=max(maxr[r(x)],sum[r(x)]+v[x]+maxr[l(x)]);
			MAX[x]=max(max(MAX[l(x)],MAX[r(x)]),maxr[l(x)]+v[x]+maxl[r(x)]);
		}
		void pushdown(int x)
		{
			#define l(x) s[x][0]
			#define r(x) s[x][1]
			if(!x) return;
			if(c_lz[x])
			{
				c_lz[l(x)]=c_lz[r(x)]=c_lz[x];
				sum[l(x)]=c_lz[x]*siz[l(x)];
				sum[r(x)]=c_lz[x]*siz[r(x)];
				v[l(x)]=v[r(x)]=c_lz[x];
				c_lz[x]=0;
			}
			if(lz[x])
			{
				lz[l(x)]^=1;
				lz[r(x)]^=1;//标记下传
				swap(maxl[l(x)],maxr[l(x)]); swap(maxl[r(x)],maxr[r(x)]);
				swap(l(x),r(x));
				lz[x]=0;
			}
		}
		int build(int l,int r,int f)
		{
			if(l>r) return 0;
			int mid=l+r>>1;
			int id=++bstsiz;
			prt[id]=f;
			++siz[id];
			sum[id]=v[id]=ins[mid];
			MAX[id]=maxl[id]=maxr[id]=v[id];
			s[id][0]=build(l,mid-1,id);
			s[id][1]=build(mid+1,r,id);
			pushup(id);
			return id;
		}
		bool ifr(int x){return x==s[prt[x]][1];}
		/*左为0右为1*/
		void rot(int x)
		{
			int fx=prt[x],ffx=prt[fx];//fx:父亲 ffx:爷爷
			pushdown(x),pushdown(fx);
			bool w=ifr(x);
			s[fx][w]=s[x][w^1];
			prt[s[fx][w]]=fx;
			prt[fx]=x; prt[x]=ffx;
			s[x][w^1]=fx;
			if(ffx)
			{
				s[ffx][fx==s[ffx][1]]=x;
			}
			pushup(fx);
		}
		void splay(int x,int to)
		{
			for(int fx;(fx=prt[x])!=to;rot(x))
			{
				if(prt[fx]!=to)
				rot(ifr(x)==ifr(fx)?fx:x);
				//同向旋父,异向转子
			}
			if(!to) root=x;
		}
		int kth(int k)
		{
			int x=root;
			while(true)
			{
				pushdown(x);
				if(k<=siz[s[x][0]]) x=s[x][0];
				else
				{
					k-=siz[s[x][0]]+1;
					if(k==0) return x;
					x=s[x][1];
				}
			}
		}
		void del(int lenth)
		{
			splay(kth(_mousePos-1),0);//鼠标指针到根
			splay(kth(siz[s[root][0]]+lenth+2),root);
			s[s[root][1]][0]=0; 
			pushup(s[root][1]); pushup(root);
		}
		void reverse(int lenth)
		{
			splay(kth(_mousePos-1),0);//鼠标指针到根
			splay(kth(siz[s[root][0]]+lenth+2),root);
			lz[s[s[root][1]][0]]^=1;
		}
		void change(int lenth,int k)
		{
			splay(kth(_mousePos-1),0);//鼠标指针到根
			splay(kth(siz[s[root][0]]+lenth+2),root);
			c_lz[s[s[root][1]][0]]=k;
		}
		void getMAXc()
		{
			_mousePos=2;
			splay(kth(_mousePos-1),0);
			splay(kth(siz[s[root][0]]+NumIN+2),root);
			printf("%d\n",MAX[root]);
		}
		void getsum(int lenth)
		{
			
			splay(kth(_mousePos-1),0);
			splay(kth(siz[s[root][0]]+lenth+2),root);
			printf("%d\n",sum[s[s[root][1]][0]]);
		}
		void insert(int lenth)
		{
			splay(kth(_mousePos-1),0);
			splay(kth(_mousePos),root);
			s[s[root][1]][0]=build(1,lenth,s[root][1]);
			prt[s[s[root][1]][0]]=s[root][1];
			splay(s[s[root][1]][0],0);
			pushup(s[root][1]); pushup(root);
		}
		void getchar()
		{
			int kt=kth(_mousePos);
			splay(kt,0);
			putchar(char(v[kt]));
			if(char(v[kt])!='\n') putchar('\n');
		}
		void dfs(int r)
		{
			if(s[r][0]) dfs(s[r][0]);
			cout<<v[r]<<" ";
			if(s[r][1]) dfs(s[r][1]);
		}
		void dfs2(int r)
		{
			if(s[r][0]) dfs(s[r][0]);
			cout<<sum[r]<<" ";
			if(s[r][1]) dfs(s[r][1]);
		}
}t;
int main()
{
	#define getpos() scanf("%d",&_mousePos),_mousePos+=1
	int n,m;
	scanf("%d %d",&n,&m);
	NumIN=n;
	for(int i=2;i<=n+1;i++) scanf("%d",ins+i);
	t.root=t.build(1,n+2,0);
	char op[15];
	int k,lenth;
	while(m--)
	{
		scanf("%s",op);
		if(op[0]=='I')
		{
			getpos();
			_mousePos++; scanf("%d",&lenth);
			NumIN+=lenth;
			for(int i=1;i<=lenth;i++) scanf("%d",ins+i);
			t.insert(lenth);
		}
		else if(op[0]=='D') getpos(),scanf("%d",&lenth),NumIN-=lenth,t.del(lenth);
		else if(op[0]=='R') getpos(),scanf("%d",&lenth),t.reverse(lenth);
		else if(op[0]=='G') getpos(),scanf("%d",&lenth),t.getsum(lenth);
		else if(op[2]=='K') getpos(),scanf("%d %d",&lenth,&k),t.change(lenth,k);
		else t.getMAXc();
		//t.dfs(t.root);
		//puts("");
		//t.dfs2(t.root);
	}
	
}
2022/4/12 21:45
加载中...