您的位置:首页 > 产品设计 > UI/UE

codechef Tree and Queries Solved

2015-09-23 00:31 501 查看
题目链接:https://www.codechef.com/problems/IITK1P10 大概是:修改点值,求子树节点为0有多少个,

DFS序后,BIT 询问,修改

1 #include<bits/stdc++.h>
2
3 using namespace std;
4 typedef long long ll;
5
6 #define N 223456
7 ll val
;
8 int l
,r
;
9 int t=1;
int f
;
int lowbit(int x)
{
return x&-x;
}
void update(int x,int v)
{
while (x<N)
{
f[x]+=v;
x+=lowbit(x);
}
}
ll query(int x)
{
ll s=0;
while (x)
{
s+=f[x];
x-=lowbit(x);
}
return s;
}
vector<int>mp
;
void dfs(int u,int pre)
{
l[u]=t++;
for (int i=0;i<mp[u].size();i++)
{
int v=mp[u][i];
if (v==pre) continue;
dfs(v,u);
}
r[u]=t-1;
}

int main()
{
int n,Q;
scanf("%d%d",&n,&Q);
for (int i=1;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
mp[x].push_back(y);
mp[y].push_back(x);
}
dfs(1,0);
for (int i=1;i<=n;i++)
{
scanf("%d",&val[i]);
if (val[i]==0) update(l[i],1);
}
while (Q--)
{
char s[4];
scanf("%s",s);
if (s[0]=='U')
{
int u,v;
scanf("%d%d",&u,&v);
if (val[u]==0) update(l[u],-1);
val[u]+=v;
if (val[u]==0) update(l[u],1);
}else
{
int x;
scanf("%d",&x);
int ans=query(r[x])-query(l[x]-1);
printf("%d\n",ans);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: