求助
查看原帖
求助
143925
吴勉之楼主2020/6/17 20:31
#include<bits/stdc++.h>
using namespace std;
#define N 100005 
int rd()
{
	int x=0,y=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')y=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+(ch^48);ch=getchar();}
	return x*y;
}
struct edge
{
	int v,to;
}e[N];
int n,head[N],tot;
void add(int u,int v)
{
	e[++tot].v=v;
	e[tot].to=head[u];
	head[u]=tot;
}
int dep[N],fa[N],son[N],sz[N],pre[N],id[N],dfn,top[N];
void dfs1(int u,int f,int dp)
{
	fa[u]=f;
	dep[u]=dp;
	sz[u]=1;
	for(int i=head[u];i!=-1;i=e[i].to)
	{
		int v=e[i].v;
		dfs1(v,u,dp+1);
		sz[u]+=sz[v];
		if(son[u]==-1||sz[son[u]]<sz[v])son[u]=v;
	}
}
void dfs2(int u,int tp)
{
	//printf("%d\n",u);
	id[u]=++dfn;
	pre[dfn]=u;
	top[u]=tp;
	if(son[u]==-1)return;
	dfs2(son[u],tp);
	for(int i=head[u];i!=-1;i=e[i].to)
	{
		int v=e[i].v;
		if(v!=son[u])dfs2(v,v);
	}
}
int m,x;
string s;
struct tree
{
	int l,r,sum,tag;
}t[N<<2];
int ls(int x){return x<<1;}
int rs(int x){return x<<1|1;}
int len(int x){return t[x].r-t[x].l+1;}
void pushup(int x){t[x].sum=t[ls(x)].sum+t[rs(x)].sum;}
void pushdown(int x)
{
	t[ls(x)].tag=t[rs(x)].tag=t[x].tag;
	t[ls(x)].sum+=len(ls(x))*t[x].tag;
	t[rs(x)].sum+=len(rs(x))*t[x].tag;
	t[x].tag=-1;
}
void build(int x,int l,int r)
{
	t[x].l=l;
	t[x].r=r;
	t[x].tag=-1;
	if(l==r)return;
	int mid=l+r>>1;
	build(ls(x),l,mid);
	build(rs(x),mid+1,r);
}
void upd(int x,int L,int R,int w)
{
	int l=t[x].l,r=t[x].r;
	//printf("%d %d %d %d\n",l,r,L,R);
	t[x].sum=w;
	if(L<=l&&r<=R)
	{
		t[x].sum=len(x)*w;
		t[x].tag=w;
		return;
	}
	if(t[x].tag!=-1)pushdown(x);
	int mid=l+r>>1;
	if(L<=mid)upd(ls(x),L,R,w);
	if(R> mid)upd(rs(x),L,R,w);
	pushup(x);
}
void Qupd(int u,int v,int w)
{
	while(top[u]!=top[v])
	{
		if(dep[top[u]]<dep[top[v]])swap(u,v);
		upd(1,id[top[u]],id[u],w);
		u=fa[top[u]];
	}
	if(dep[u]>dep[v])swap(u,v);
	upd(1,id[u],id[v],w);
}
int main()
{
	memset(head,-1,sizeof head);
	memset(son,-1,sizeof son);
	n=rd();
	for(int i=1,x;i<n;i++)
	{
		x=rd();
		add(x,i);
	} 
	dfs1(0,-1,1);
	dfs2(0,0);
	//for(int i=0;i<n;i++)printf("%d %d %d\n",fa[i],son[i],dep[i]);
	//for(int i=0;i<n;i++)printf("%d %d %d\n",id[i],pre[i],top[id[i]]);
	build(1,1,dfn);
	m=rd();
	while(m--)
	{
		int now=t[1].sum;
		cin>>s;
		x=rd();
		if(s[0]=='i')Qupd(0,x,1);
		else upd(1,id[x],id[x]+sz[x]-1,0);
		int then=t[1].sum;
		printf("%d\n",abs(now-then));
	}
	return 0;
}

为什么我每次求问树剖都没人来
跟第一篇题解似乎差不多,但我没有整体往后拖一位
第一个样例过了,但第二个炸了
求教

2020/6/17 20:31
加载中...