70~80分求助,随机RE,打开O2之后随机RE、CE、AC
查看原帖
70~80分求助,随机RE,打开O2之后随机RE、CE、AC
128961
CHUAN02162楼主2021/7/27 10:54
#include<bits/stdc++.h>
#define lc p<<1
#define rc p<<1|1
#define rep(i,st,ed) for(int i=st;i<=ed;++i)
#define bl(u,i) for(int i=head[u];i;i=e[i].nxt)
#define en puts("")
#define LLM LONG_LONG_MAX
#define LLm LONG_LONG_MIN
#define pii pair<ll,ll> 
typedef long long ll;
typedef double db;
using namespace std;
const ll INF=0x3f3f3f3f;
void read() {}
void OP() {}
void op() {}
template <typename T, typename... T2>
inline void read(T &_, T2 &... oth)
{
    int __=0;
    _=0;
    char ch=getchar();
    while(!isdigit(ch))
    {
        if(ch=='-')
            __=1;
        ch=getchar();
    }
    while(isdigit(ch))
    {
        _=_*10+ch-48;
        ch=getchar();
    }
    _=__?-_:_;
    read(oth...);
}
template <typename T>
void Out(T _)
{
    if(_<0)
    {
        putchar('-');
        _=-_;
    }
    if(_>=10)
       Out(_/10);
    putchar(_%10+'0');
}
template <typename T, typename... T2>
inline void OP(T _, T2... oth)
{
	Out(_);
	putchar('\n');
	OP(oth...);
}
template <typename T, typename... T2>
inline void op(T _, T2... oth)
{
	Out(_);
	putchar(' ');
	op(oth...);
}
/*#################################*/
const ll N=2E5+10;
ll n,q,tot,timer;
ll head[N],dep[N],siz[N],father[N],son[N],dfsn[N],top[N],sum[4*N],tag[4*N];
struct Edge{
	ll nxt,to,w;
}e[N];
void add_edge(ll u,ll v,ll w,int flag)
{
	e[++tot]=(Edge){head[u],v,w};
	head[u]=tot;
	if(flag)
		add_edge(v,u,w,0);
}
void dfs(ll u,ll fa)
{
	dep[u]=dep[fa]+1;
	siz[u]=1;
	father[u]=fa;
	bl(u,i)
	{
		ll v=e[i].to;
		if(v==fa)
			continue;
		dfs(v,u);
		if(siz[v]>siz[son[u]])
			son[u]=v;
		siz[u]+=siz[v];
	}
}
void dfs_(ll u,ll tp)
{
	dfsn[u]=++timer;
	top[u]=tp;
	if(!son[u])
		return;
	dfs_(son[u],tp);
	bl(u,i)
	{
		ll v=e[i].to;
		if(v==son[u] || v==father[u])
			continue;
		dfs_(v,v);
	}
}
void update(ll p)
{
	sum[p]=sum[lc]+sum[rc];
}
void push_down(ll p,ll l,ll r)
{
	ll mid=(l+r)>>1;
	tag[lc]=tag[p];
	sum[lc]=tag[p]?(mid-l+1):0;
	tag[rc]=tag[p];
	sum[rc]=tag[p]?(r-mid):0;
	tag[p]=-1;
}
void cover(ll p,ll l,ll r,ll al,ll ar,ll val)
{
	if(al<=l && ar>=r)
	{
		tag[p]=val;
		sum[p]=val?(r-l+1):0;
		return;
	}
	ll mid=(l+r)>>1;
	if(tag[p]!=-1)
		push_down(p,l,r);
	if(al<=mid)
		cover(lc,l,mid,al,ar,val);
	if(ar>mid)
		cover(rc,mid+1,r,al,ar,val);
	update(p);
}
ll query(ll p,ll l,ll r,ll al,ll ar)
{
	if(al<=l && ar>=r)
		return sum[p];
	ll mid=(l+r)>>1,ret=0;
	if(tag[p]!=-1)
		push_down(p,l,r);
	if(al<=mid)
		ret+=query(lc,l,mid,al,ar);
	if(ar>mid)
		ret+=query(rc,mid+1,r,al,ar);
	return ret;
}
void print()
{
	rep(i,1,4*n)
	{
		op(sum[i],tag[i]);
		en;
	}
	en;
}
int main()
{
	read(n);
	rep(i,1,4*n)
		tag[i]=-1;
	ll u;
	rep(v,2,n)
	{
		read(u);
		++u;
		add_edge(u,v,0,0);
	}
	string s;
	dfs(1,0);
	dfs_(1,1);
	// OP(dfsn[1237]);
	read(q);
	while(q--)
	{
		cin>>s;
		read(u);
		++u;
		if(s=="install")
		{
			ll res=dep[u];
			while(top[u])
			{
				res-=query(1,1,n,dfsn[top[u]],dfsn[u]);
				cover(1,1,n,dfsn[top[u]],dfsn[u],1);
				u=father[top[u]];
			}
			OP(res);
		}
		else
		{
			ll res=query(1,1,n,dfsn[u],dfsn[u]+siz[u]-1);
			cover(1,1,n,dfsn[u],dfsn[u]+siz[u]-1,0);
			OP(res);
		}
	}
}
2021/7/27 10:54
加载中...