-
POJ 3321 Apple Tree
VJ链接:https://vjudge.net/problem/POJ-3321
先贴上以后补题解。。(咕咕咕
一个教训就是树状数组一定要从一开始,
一个while(x>=0)死循环了找半天,,,太久不用树状数组了。
//#include <bits/stdc++.h>
#include<map>
#include<set>
#include<queue>
#include<cmath>
#include<stack>
#include<ctime>
#include<cstdio>
#include<vector>
#include<string>
#include<sstream>
#include<cstdlib>
#include<cstring>
#include<cassert>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int MAXN=1e5+10;
#define pi acos(-1.0)
#define INF 0x3f3f3f3f
#define mod 1000000009
#define endll printf("\n")
#define s1(a) scanf("%d",&a)
#define s2(a,b) scanf("%d %d",&a,&b)
#define mem(a,b) memset(a,b,sizeof(a))
#define s3(a,b,c) scanf("%d %d %d",&a,&b,&c)
int n,m,tot,cnt;
int head[MAXN];
int in[MAXN],out[MAXN];
int bits[MAXN];
struct IN
{
int v;
int next;
}edge[MAXN<<2];//注意无向存图
void addedge(int u,int v)
{
edge[tot].v=v;
edge[tot].next=head[u];
head[u]=tot++;
}
void input()
{
s1(n);
tot=1;
mem(head,0);
for(int i=0;i<n-1;i++)
{
int u,v;
scanf("%d %d",&u,&v);
addedge(u,v);
addedge(v,u);
}
}
//
void dfs(int x,int pre)
{
in[x]=++cnt;
for(int i=head[x];i;i=edge[i].next)
{
int nx=edge[i].v;
if(nx!=pre)
dfs(nx,x);
}
out[x]=cnt;
//out时不记录时间戳那么in[i]序列即为原数组重新排号之后的新序列
//in[i]数组范围即为1~n
}
//
void update(int x,int v)
{
while(x<=n)
{
bits[x]+=v;
x+=(x&(-x));
}
}
int sum(int x)
{
int ans=0;
while(x>0)//血的教训啊。。。
{
ans+=bits[x];
x-=(x&-x);
}
return ans;
}
int main()
{
input();//建图
cnt=0;
dfs(1,0);
for(int i=1;i<=n;i++)
update(i,1);
s1(m);
while(m--)
{
char op[4];
int x;
scanf("%s %d",op,&x);
if(op[0]=='Q')
printf("%d\n",sum(out[x])-sum(in[x]-1));
else
update(in[x],(sum(in[x])-sum(in[x]-1))?-1:1);
}
return 0;
}

京公网安备 11010502036488号