讨论 / 卧槽,我写戳了?加个输入外挂就AC了,不加就TLE了两个点
w703710691d 2014-08-24 18:57:58
点我顶贴 收藏 删除
#include<cstdio>

#include<cstring>

#include<algorithm>

#include<iostream>

#define N 100005

using namespace std;

struct EDGE

{

int to,next;

}edge[N<<1];

int edgecnt;

int head[N];

void addedge(int from,int to)

{

edge[edgecnt]=(EDGE){to,head[from]};

head[from]=edgecnt++;

}

int eula[N<<1];

int eulacnt;

void init()

{

edgecnt=0;

memset(head,-1,sizeof(head));

eulacnt=0;

}

void dfs(int id,int fa)

{

eula[eulacnt++]=id;

for(int i=head[id];~i;i=edge[i].next)

{

if(edge[i].to==fa) continue;

dfs(edge[i].to,id);

}

eula[eulacnt++]=id;

}

int l[N],r[N];

int who[N<<1];

int n;

void getlr()

{

memset(l,0x7F,sizeof(l));

memset(r,0,sizeof(r));

for(int i=0;i<eulacnt;i++)

{

l[eula[i]]=min(l[eula[i]],i);

r[eula[i]]=max(r[eula[i]],i);

}

memset(who,0,sizeof(who));

for(int i=1;i<=n;i++) who[l[i]]=i;

}

struct node

{

int l,r,cnt0,cnt1;

bool XOR;

}tree[N<<3];

inline void ex(int id)

{

int t=tree[id].cnt0;

tree[id].cnt0=tree[id].cnt1;

tree[id].cnt1=t;

}

inline void pushdown(int id)

{

if(tree[id].XOR)

{

tree[id<<1].XOR^=1;

ex(id<<1);

tree[id<<1|1].XOR^=1;

ex(id<<1|1);

tree[id].XOR=0;

}

}

inline void pushup(int id)

{

tree[id].cnt0=tree[id<<1].cnt0+tree[id<<1|1].cnt0;

tree[id].cnt1=tree[id<<1].cnt1+tree[id<<1|1].cnt1;

}

void build(int id,int l,int r)

{

tree[id].l=l;

tree[id].r=r;

tree[id].XOR=0;

tree[id].cnt1=0;

if(l==r) tree[id].cnt0=who[l]?1:0;

else

{

int mid=(l+r)>>1;

build(id<<1,l,mid);

build(id<<1|1,mid+1,r);

pushup(id);

}

}

void op(int id,int l,int r)

{

if(l<=tree[id].l&&tree[id].r<=r)

{

tree[id].XOR^=1;

ex(id);

}

else

{

int mid=(tree[id].l+tree[id].r)>>1;

pushdown(id);

if(l<=mid) op(id<<1,l,r);

if(mid<r) op(id<<1|1,l,r);

pushup(id);

}

}

int que(int id,int l,int r)

{

if(l<=tree[id].l&&tree[id].r<=r) return tree[id].cnt1;

else

{

pushdown(id);

int mid=(tree[id].l+tree[id].r)>>1;

int res=0;

if(l<=mid) res+=que(id<<1,l,r);

if(mid<r) res+=que(id<<1|1,l,r);

return res;

}

}

inline int getint()

{

int c;

while(c=getchar(),c<'0'||'9'<c);

int res=c-48;

while(c=getchar(),'0'<=c&&c<='9') res=(res<<3)+res+res+c-48;

return res;

}

int main()

{

n=getint();

init();

int i;

for(i=1;i<n;i++)

{

int s,t;

s=getint();

t=getint();

addedge(s,t);

addedge(t,s);

}

dfs(1,0);

getlr();

build(1,0,eulacnt-1);

int m;

m=getint();

while(m--)

{

char s[10];

int p;

scanf("%s",s);

p=getint();

if(s[0]=='Q')

{

printf("%d\n",que(1,l[p],r[p]));

}

else op(1,l[p],r[p]);

}

return 0;

}

查看更多回复
提交回复