奇怪的问题
  • 板块P2710 数列
  • 楼主qzmoot
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/10/18 19:38
  • 上次更新2024/10/18 21:41:42
查看原帖
奇怪的问题
774854
qzmoot楼主2024/10/18 19:38

下载数据后本地fc没有差异,在洛谷上wa #17

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e5+5,inf=1e18;
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 st[N],top;
int gn(int key)
{
	int now=top?st[top--]:++idx;
	tr[now].l=tr[now].r=tr[now].rev=0;
	tr[now].val=rand();	
	tr[now].ky=tr[now].sum=tr[now].mx=key;
	tr[now].sa=inf;
	tr[now].ls=tr[now].rs=max(0ll,key);
	tr[now].siz=1;
	return now;
}
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[tr[p].l].ls,max(0ll,tr[tr[p].l].sum+tr[p].ky+tr[tr[p].r].ls));
	tr[p].rs=max(tr[tr[p].r].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);
	if(tr[p].l)
		tr[p].mx=max(tr[p].mx,tr[tr[p].l].mx);
	if(tr[p].r)
		tr[p].mx=max(tr[p].mx,tr[tr[p].r].mx);
}
void pd(int p)
{
	if(tr[p].sa!=inf)
	{
		if(tr[p].l)
		{
			tr[tr[p].l].ky=tr[tr[p].l].sa=tr[p].sa;
			tr[tr[p].l].sum=tr[tr[p].l].siz*tr[p].sa;
			tr[tr[p].l].ls=tr[tr[p].l].rs=max(0ll,tr[tr[p].l].sum);
			tr[tr[p].l].mx=max(tr[tr[p].l].sum,tr[p].sa);
		}
		if(tr[p].r)
		{
			tr[tr[p].r].ky=tr[tr[p].r].sa=tr[p].sa;
			tr[tr[p].r].sum=tr[tr[p].r].siz*tr[p].sa;
			tr[tr[p].r].ls=tr[tr[p].r].rs=max(0ll,tr[tr[p].r].sum);
			tr[tr[p].r].mx=max(tr[tr[p].r].sum,tr[p].sa);
		}
		tr[p].sa=inf;
	}
	if(tr[p].rev)
	{
		if(tr[p].l)
		{
			tr[tr[p].l].rev^=1;
			swap(tr[tr[p].l].l,tr[tr[p].l].r);
			swap(tr[tr[p].l].ls,tr[tr[p].l].rs);
		}
		if(tr[p].r)
		{
			tr[tr[p].r].rev^=1;
			swap(tr[tr[p].r].l,tr[tr[p].r].r);
			swap(tr[tr[p].r].ls,tr[tr[p].r].rs);
		}
		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 dl(int p)
{
	if(tr[p].l)
		dl(tr[p].l);
	if(tr[p].r)
		dl(tr[p].r);
	st[++top]=p;
}
void del(int l,int r)
{
	int x,y,z;
	split(rt,l-1,x,y);
	split(y,r,y,z);
	dl(y);
	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;
	swap(tr[y].l,tr[y].r);
	swap(tr[y].ls,tr[y].rs);
	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].ky=tr[y].sa=vl;
	tr[y].sum=tr[y].siz*vl;
	tr[y].ls=tr[y].rs=max(0ll,tr[y].sum);
	tr[y].mx=max(tr[y].mx,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);
	cout<<tr[y].sum<<'\n';
	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);
	cout<<tr[z].ky<<'\n';
	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);
	cout<<tr[y].mx<<'\n';
	rt=merge(merge(x,y),z);
}
signed main()
{
//	freopen("P2710.in","r",stdin);
//	freopen("my.out","w",stdout);
	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,y);
		}
		else if(op=="REVERSE")
		{
			int x,y;
			cin>>x>>y;
			rev(x,y);
		}
		else if(op=="MAKE-SAME")
		{
			int x,y,z;
			cin>>x>>y>>z;
			upd(x,y,z);
		}
		else if(op=="GET-SUM")
		{
			int x,y;
			cin>>x>>y;
			query_sum(x,y);
		}
		else if(op=="GET")
		{
			int x;
			cin>>x;
			get(x);
		}
		else
		{
			int x,y;
			cin>>x>>y;
			query_max(x,y);
		}
	}
	return 0;
}
2024/10/18 19:38
加载中...