您的位置:首页 > 其它

bzoj 1103 POI2007 大都市meg

2016-10-15 10:55 225 查看
这个题的题面 好难懂。。

好吧,这题放了它好几天了

树剖应该也可以吧?

但是细想想就发现修改一个点只会影响它的子树,所以我们用dfs序来搞定它,用进栈时间和出栈时间搞定它

然后树状数组搞一下。

感觉区间+1-1很妙啊。

今天大学节想去的地方好难考

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
//by mars_ch
int in[250005],out[250005],line[250005];
int l[250005];
int c[25000005];
int n,dfn,tot;
struct data
{
int f,t,nxt;
}e[250005*5];
int first[250005];
void add(int a,int b)
{
e[tot].f=a;
e[tot].t=b;
e[tot].nxt=first[a];
first[a]=tot++;
}
void dfs(int x,int f)
{
in[++dfn]=x;
line[x]=dfn;
for(int i=first[x];i!=-1;i=e[i].nxt)
{
int v=e[i].t;
if(v==f) continue;
l[v]=l[x]+1;
dfs(v,x);
}
out[x]=dfn+1;
}
int lowbit(int x)
{
return x&(-x);
}
void updata(int x,int y)
{
while(x<=dfn)
{
c[x]+=y;
x+=lowbit(x);
}
}
int getsum(int x)
{
int res=0;
while(x)
{
res+=c[x];
x-=lowbit(x);
}
return res;
}
int main()
{
scanf("%d",&n);
memset(first,-1,sizeof(first));
for(int i=1;i<n;i++)
{
int a,b;
scanf("%d%d",&a,&b);
add(a,b);
add(b,a);
}
dfs(1,0);
for(int i=1;i<=n;i++)
{
printf("%d %d\n",line[i],out[i]);
}
int m;
scanf("%d",&m);
int t=n+m-1;
while(t--)
{
char op[5];
scanf("%s",op);
if(op[0] == 'A')
{
int x,y;
scanf("%d%d",&x,&y);
updata(line[y],1),updata(out[y],-1);
}
else
{
int x;
scanf("%d",&x);
printf("%d\n",l[x]-getsum(line[x]));
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: