求助:C P2146 [NOI2015]软件包管理器 救救蒟蒻⑧%%%%%%%
  • 板块学术版
  • 楼主LoverBoyInMacau
  • 当前回复7
  • 已保存回复7
  • 发布时间2020/7/30 20:56
  • 上次更新2023/11/6 21:44:08
查看原帖
求助:C P2146 [NOI2015]软件包管理器 救救蒟蒻⑧%%%%%%%
262074
LoverBoyInMacau楼主2020/7/30 20:56

P2146 [NOI2015]软件包管理器 程序卡死了。。。。。。

#include<bits/stdc++.h>
using namespace std;
#define il inline
#define re register
const int maxsize=400010;
int cnt,num,n,m;
int head[maxsize],lazy[maxsize],tr[maxsize],dep[maxsize];
int father[maxsize],son[maxsize],size[maxsize],id[maxsize],top[maxsize];
char s[21];
il int read()
{
	int w=0,x=0;char ch=0;
	while(!isdigit(ch))  w|=ch=='-',ch=getchar();
	while(isdigit(ch))  x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
	return w?-x:x;
}

il void write(int x)
{
	if(x>9)  write(x/10);
	if(x<0)  x=-x,putchar('-');
	putchar(x%10+'0');
}

struct edge
{
	int to,nxt;
}e[maxsize];

il void add(int u,int v)
{
	e[++cnt].to=v;
	e[cnt].nxt=head[u];
	head[u]=cnt;
}

il void down(int x,int l,int r)
{
	if(lazy[x]==-1)  return;
	lazy[x<<1]=lazy[x];lazy[x<<1|1]=lazy[x];
	int mid=(l+r)>>1;
	tr[x<<1]=(mid+1-l)*lazy[x];
	tr[x<<1|1]=(r-mid)*lazy[x];
	lazy[x]=-1;
}

il void dfs1(int x,int fax,int depx)
{
	dep[x]=depx;father[x]=fax;size[x]=1;
	for(re int i=head[x];i;i=e[i].nxt)
	{
		int v=e[i].to;
		if(v==fax)  continue;
		dfs1(v,x,depx+1);
		size[x]+=size[v];
		if(size[v]>size[son[x]])  son[x]=v;
	}
}

il void dfs2(int x,int t)
{
	top[x]=t;id[x]=++num;
	if(son[x])  dfs2(son[x],t);
	for(re int i=head[x];i;i=e[i].nxt){int v=e[i].to;if(v==father[x]||v==son[x])continue; dfs2(v,v);}
}

il void build(int x,int l,int r)
{
	if(l==r)  {tr[x]=0;return;}
	int mid=(l+r)>>1;
	build(x<<1,l,mid);
	build(x<<1|1,mid+1,r);
	tr[x]=tr[x<<1]+tr[x<<1|1];
}

il void change(int x,int lnow,int rnow,int lwant,int rwant,int w)
{
	if(lwant<=lnow&&rwant>=rnow)  {lazy[x]=w;tr[x]=w*(rnow-lnow+1);return;}
	down(x,lnow,rnow);
	int mid=(lnow+rnow)>>1;
	if(lwant<=mid)  change(x<<1,lnow,rnow,lwant,rwant,w); 
	if(rwant>mid)  change(x<<1|1,lnow,rnow,lwant,rwant,w);
	tr[x]=tr[x<<1]+tr[x<<1|1];
}

il void edgechange(int x,int y,int w)
{
	while(top[x]!=top[y])
	{
		if(dep[top[x]]<dep[top[y]])  swap(x,y);
		change(1,1,n,id[top[x]],id[x],1);
		x=father[top[x]];
	}
	if(dep[x]>dep[y])  swap(x,y);
	change(1,1,n,id[x],id[y],1);
}

int main()
{
	n=read();
	for(re int i=2;i<=n;i++){int x=read()+1;add(x,i);}
	dfs1(1,1,1);dfs2(1,0);build(1,1,n);
	m=read();
	for(re int i=1;i<m;i++)
	{
		scanf("%s",s+1);
		int x=read()+1;
		int temp=tr[1];
		if(s[1]=='i'){edgechange(1,x,1);int t=tr[1];write(abs(temp-t)),puts(" ");}
		if(s[1]=='u'){change(1,1,n,id[x],id[x]+size[x]-1,0);int t=tr[1];write(abs(temp-t));puts(" ");}
	}
	return 0;
}
2020/7/30 20:56
加载中...