#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=250000+6;
int C[N<<1],head[N<<1],to[N<<1],nex[N<<1],idx[N],cnt,idx2[N];
int nums=0;
void add_edge(int u,int v){
nex[++cnt]=head[u],head[u]=cnt,to[cnt]=v;
}
int lowbit(int t){
return t&(-t);
}
void update(int t,int delta){
while(t<(N<<1))C[t]+=delta,t+=lowbit(t);
}
int query(int t){
int tmp=0;
while(t>0)tmp+=C[t],t-=lowbit(t);
return tmp;
}
void dfs(int u,int fa)
{
++nums;
if(u!=1)update(nums,1);
idx[u]=nums;
for(int v=head[u];v;v=nex[v])
if(to[v]!=fa)dfs(to[v],u);
++nums;
if(u!=1)update(nums,-1);
idx2[u]=nums;
}
int main()
{
// freopen("in.txt","r",stdin);
int n,m;
scanf("%d",&n);
for(int i=1;i<n;++i){
int a,b;
scanf("%d%d",&a,&b);
add_edge(a,b);
add_edge(b,a);
}
dfs(1,-1);
scanf("%d",&m);
for(int i=1;i<=m+n-1;++i)
{
char s[4];
scanf("%s",s);
if(s[0]=='W')
{
int a;
scanf("%d",&a);
printf("%d\n",query(idx[a]));
}
else if(s[0]=='A')
{
int a,b;
scanf("%d%d",&a,&b);
int cur=max(idx[a],idx[b]);
int cur2=min(idx2[a],idx2[b]);
update(cur,-1);
update(cur2+1,1);
}
}
return 0;
}
[POI2007]MEG-Megalopolis 树状数组 + dfs序前缀和 好题
原创mb60dd3a6942180 ©著作权
©著作权归作者所有:来自51CTO博客作者mb60dd3a6942180的原创作品,请联系作者获取转载授权,否则将追究法律责任
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
JieZuo POI
通过JieZuo Poi 进行word填充
word apache poi JieZuo poi -
Java 中数组的使用(一维数组和二维数组)
本文详细的介绍了,在Java 中数组的使用,并对其内存存在形式进行了详细的分析。
数组 一维数组 二维数组 java基础 -
bzoj 1103 bzoj [POI2007]大都市meg
树状数组维护dfs序差分和
#include #define Memory -
1103: [POI2007]大都市meg
dfs序+差分+树状数组。这题很简单。 但是要注意dfs新编号的问题。
#include i++ ios 树状数组 差分 -
linux 开放22端口centos
1.下载禅道安装包,选择一键式安装包,注意下载的版本与操作系统和位数保持一致。 Linux 64位下载地址: http://dl.cnezsoft.com/zentao/10.6/ZenTaoPMS.10.6.stable.zbox_64.tar.gz Linux 32位下载地址: http://dl.cnezsoft.com/zentao/10.6/ZenTaoP
linux 开放22端口centos linux 22端口不通 linux 关闭端口 linux 开启端口 linux 重启mysql