可爱小萌新刚学平衡树1ms,求调fhq
  • 板块P2710 数列
  • 楼主qzmoot
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/10/18 15:13
  • 上次更新2024/10/18 18:40:17
查看原帖
可爱小萌新刚学平衡树1ms,求调fhq
774854
qzmoot楼主2024/10/18 15:13

代码十分的简单。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5;
int n,m,a[N];
struct fhq{
	int l,r,ls,rs,mx,sum,val,ky,siz,rev,sa;
}tr[N];
int rt,idx;
int gn(int key)
{
	tr[++idx].ky=key;
	tr[idx].val=rand();
	tr[idx].sum=tr[idx].mx=key;
	tr[idx].sa=1001;
	tr[idx].ls=tr[idx].rs=max(0ll,key);
	tr[idx].siz=1;
	return idx;
}
void pu(int p)
{
	tr[p].siz=tr[tr[p].l].siz+tr[tr[p].r].siz+1;
	tr[p].sum=tr[tr[p].l].sum+tr[tr[p].r].sum+tr[p].ky;
	tr[p].ls=max(tr[p].ls,max(0ll,tr[tr[p].l].sum+	tr[p].ky+tr[tr[p].r].ls));
	tr[p].rs=max(tr[p].rs,max(0ll,tr[tr[p].r].sum+tr[p].ky+tr[tr[p].l].rs));
	tr[p].mx=max(tr[p].ky,tr[tr[p].r].ls+tr[tr[p].l].rs+tr[p].ky);
	tr[p].mx=max(tr[p].mx,tr[tr[p].l].mx);
	tr[p].mx=max(tr[p].mx,tr[tr[p].r].mx);
}
void pd(int p)
{
	if(tr[p].sa!=1001)
	{
		tr[tr[p].l].sa=tr[tr[p].r].sa=tr[p].sa;
		tr[p].ky=tr[p].sa;
		tr[p].sum=tr[p].sa*tr[p].siz;
		tr[p].ls=tr[p].rs=max(0ll,tr[p].sum);
		tr[p].mx=max(tr[p].mx,tr[p].sa);
		tr[p].sa=1001;
	}
	if(tr[p].rev)
	{
		tr[tr[p].l].rev^=1;
		tr[tr[p].r].rev^=1;
		swap(tr[p].l,tr[p].r);
		tr[p].rev=0;
	}
}
void split(int p,int k,int& x,int& y)
{
	if(!p)
	{
		x=y=0;
		return;
	}
	pd(p);
	if(tr[tr[p].l].siz<k)
		x=p,split(tr[p].r,k-tr[tr[p].l].siz-1,tr[p].r,y);
	else
		y=p,split(tr[p].l,k,x,tr[y].l);
	pu(p);
}
int merge(int x,int y)
{
	if(!x || !y)
		return x+y;
	if(tr[x].val>tr[y].val)
	{
		pd(x);
		tr[x].r=merge(tr[x].r,y);
		pu(x);
		return x;
	}
	else
	{
		pd(y);
		tr[y].l=merge(x,tr[y].l);
		pu(y);
		return y;
	}
}
string op;
int build(int l,int r)
{
	if(l==r)
		return gn(a[l]);
	int mid=l+r>>1;
	int x=build(l,mid),y=build(mid+1,r);
	return merge(x,y);	
}
void insert(int pos,int k)
{
	int x,y;
	split(rt,pos,x,y);
	rt=merge(merge(x,build(1,k)),y);
}
void del(int l,int r)
{
	int x,y,z;
	split(rt,l-1,x,y);
	split(y,r,y,z);
	rt=merge(x,z);
}
void rev(int l,int r)
{
	int x,y,z;
	split(rt,l-1,x,y);
	split(y,r,y,z);
	tr[y].rev^=1;
	rt=merge(merge(x,y),z);
}
void upd(int l,int r,int vl)
{
	int x,y,z;
	split(rt,l-1,x,y);
	split(y,r,y,z);
	tr[y].sa=vl;
	rt=merge(merge(x,y),z);
}
void query_sum(int l,int r)
{
	int x,y,z;
	split(rt,l-1,x,y);
	split(y,r,y,z);
	printf("%lld\n",tr[y].sum);
	rt=merge(merge(x,y),z);
}
void get(int pos)
{
	int x,y,z;
	split(rt,pos,x,y);
	split(x,pos-1,x,z);
	printf("%lld\n",tr[z].ky);
	rt=merge(merge(x,z),y);
}
void query_max(int l,int r)
{
	int x,y,z;
	split(rt,l-1,x,y);
	split(y,r,y,z);
	printf("%lld\n",tr[y].mx);
	rt=merge(merge(x,y),z);
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	rt=build(1,n);
	while(m--)
	{
		cin>>op;
		if(op=="INSERT")
		{
			int x,k;
			cin>>x>>k;
			for(int i=1;i<=k;i++)
				cin>>a[i];
			insert(x,k);
		}
		else if(op=="DELETE")
		{
			int x,y;
			cin>>x>>y;
			del(x,x+y-1);
		}
		else if(op=="REVERSE")
		{
			int x,y;
			cin>>x>>y;
			rev(x,x+y-1);
		}
		else if(op=="MAKE-SAME")
		{
			int x,y,z;
			cin>>x>>y>>z;
			upd(x,x+y-1,z);
		}
		else if(op=="GET-SUM")
		{
			int x,y;
			cin>>x>>y;
			query_sum(x,x+y-1);
		}
		else if(op=="GET")
		{
			int x;
			cin>>x;
			get(x);
		}
		else
		{
			int x,y;
			cin>>x>>y;
			query_max(x,x+y-1);
		}
	}
	return 0;
}
2024/10/18 15:13
加载中...