社区讨论

TLE 40pts求助

P2042[NOI2005] 维护数列参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@m5z5lq5e
此快照首次捕获于
2025/01/16 17:54
去年
此快照最后确认于
2025/11/04 11:30
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
int n,m,root=0,a[500005],c[500005],d1[500005],e[500005],l[500005],r[500005],cnt,s[4000005],x,y,z;
bool d2[500005];
string ch;
int newnd()
{
	if (s[0])
	return s[s[0]--];
	else
	return ++cnt;
}
struct node
{
	int l,r,sum,ans;
} b[500005];
node merge(node x,node y)
{
	node result;
	result.l=max(x.l,x.sum+y.l);
	result.r=max(y.r,x.r+y.sum);
	result.sum=x.sum+y.sum;
	result.ans=max(max(x.ans,y.ans),x.r+y.l);
	return result;
}
void pushup(int x)
{
	node nd=(node){a[x],a[x],a[x],a[x]};
	if (l[x] && r[x])
	b[x]=merge(merge(b[l[x]],nd),b[r[x]]);
	else if (l[x])
	b[x]=merge(b[l[x]],nd);
	else if (r[x])
	b[x]=merge(nd,b[r[x]]);
	else
	b[x]=nd;
    c[x]=c[l[x]]+c[r[x]]+1;
}
void pushdown(int x)
{
	if (d1[x]!=1001)
	{
		if (l[x])
		{
			a[l[x]]=d1[x];
			if (d1[x]>0)
			b[l[x]]=(node){c[l[x]]*d1[x],c[l[x]]*d1[x],c[l[x]]*d1[x],c[l[x]]*d1[x]};
			else
			b[l[x]]=(node){d1[x],d1[x],c[l[x]]*d1[x],d1[x]};
			d1[l[x]]=d1[x];
		}
		if (r[x])
		{
			a[r[x]]=d1[x];
			if (d1[x]>0)
			b[r[x]]=(node){c[r[x]]*d1[x],c[r[x]]*d1[x],c[r[x]]*d1[x],c[r[x]]*d1[x]};
			else
			b[r[x]]=(node){d1[x],d1[x],c[r[x]]*d1[x],d1[x]};
			d1[r[x]]=d1[x];
		}
		d1[x]=1001;
	}
	if (d2[x])
	{
		if (l[x])
		{
			swap(b[l[x]].l,b[l[x]].r);
			swap(l[l[x]],r[l[x]]);
			d2[l[x]]^=1;
		}
		if (r[x])
		{
			swap(b[r[x]].l,b[r[x]].r);
			swap(l[r[x]],r[r[x]]);
			d2[r[x]]^=1;
		}
		d2[x]=0;
	}
}
int merge(int x,int y)
{
	if (x && y)
	{
		if (e[x]<e[y])
		{
			pushdown(x);
			r[x]=merge(r[x],y);
			pushup(x);
			return x;
		}
		else
		{
			pushdown(y);
			l[y]=merge(x,l[y]);
			pushup(y);
			return y;
		}
	}
	else
	return x|y;
}
void split(int x,int &y,int &z,int k)
{
	if (x)
	{
		pushdown(x);
		if (c[l[x]]<k)
		{
			y=x;
			split(r[x],r[x],z,k-c[l[x]]-1);
		}
		else
		{
			z=x;
			split(l[x],y,l[x],k);
		}
		pushup(x);
	}
	else
	{
		y=0;
		z=0;
	}
}
void bianli(int x)
{
	if (x)
	{
		bianli(l[x]);
		s[++s[0]]=x;
		bianli(r[x]);
	}
}
void insert(int num1,int num2)
{
	int x,y=newnd(),z;
	a[y]=num2;
	b[y]=(node){num2,num2,num2,num2};
	c[y]=1;
	d1[y]=1001;
	e[y]=rand();
	l[y]=0;
	r[y]=0;
	split(root,x,z,num1);
	root=merge(merge(x,y),z);
}
void erase(int num1,int num2)
{
	int x,y,z;
	split(root,x,z,num2);
	split(x,x,y,num1-1);
	bianli(y);
	root=merge(x,z);
}
void modify(int num1,int num2,int num3)
{
	int x,y,z;
	split(root,x,z,num2);
	split(x,x,y,num1-1);
	a[y]=num3;
	if (num3>0)
	b[y]=(node){c[y]*num3,c[y]*num3,c[y]*num3,c[y]*num3};
	else
	b[y]=(node){num3,num3,c[y]*num3,num3};
	d1[y]=num3;
	root=merge(merge(x,y),z);
}
void reverse(int num1,int num2)
{
	int x,y,z;
	split(root,x,z,num2);
	split(x,x,y,num1-1);
	swap(b[y].l,b[y].r);
	swap(l[y],r[y]);
	d2[y]=1;
	root=merge(merge(x,y),z);
}
int query1(int num1,int num2)
{
	int x,y,z,result;
	split(root,x,z,num2);
	split(x,x,y,num1-1);
	result=b[y].sum;
	root=merge(merge(x,y),z);
	return result;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	srand(time(nullptr));
	cin>>n>>m;
	for (int i=1;i<=n;++i)
	{
		cin>>a[i];
		b[i]=(node){a[i],a[i],a[i],a[i]};
		c[i]=1;
		d1[i]=1001;
		e[i]=rand();
		root=merge(root,i);
	}
	cnt=n;
	while (m--)
	{
		cin>>ch;
		if (ch=="INSERT")
		{
			cin>>x>>y;
			while (y--)
			{
				cin>>z;
				insert(x,z);
				++x;
			}
		}
		else if (ch=="DELETE")
		{
			cin>>x>>y;
			erase(x,x+y-1);
		}
		else if (ch=="MAKE-SAME")
		{
			cin>>x>>y>>z;
			modify(x,x+y-1,z);
		}
		else if (ch=="REVERSE")
		{
			cin>>x>>y;
			reverse(x,x+y-1);
		}
		else if (ch=="GET-SUM")
		{
			cin>>x>>y;
			cout<<query1(x,x+y-1)<<'\n';
		}
		else
		cout<<b[root].ans<<'\n';
	}
}

回复

1 条回复,欢迎继续交流。

正在加载回复...