P3321-Apple Tree【树状数组】
生活随笔
收集整理的這篇文章主要介紹了
P3321-Apple Tree【树状数组】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正題
題意
有一顆樹,開始每個點的值都是1,有兩種操作:
1.將一個點的值取反
2.詢問一個子樹的值的和
解題思路
用后續遍歷就可以做到用一個區間代表一棵子樹。然后用線段樹就好了。
代碼
#include<cstdio> using namespace std; struct line{int to,next; }a[100001]; int tot,x,y,num[100001],c[100001],ls[100001],m; int n,begin[100001],mark[100001]; bool apple[100001]; char cc; void dfs(int x) {begin[x]=tot;for (int q=ls[x];q;q=a[q].next){dfs(a[q].to);}mark[x]=++tot; }//深搜求后序遍歷 int lowbit(int x) {return x&(-x);} void change(int x,int num)//改變 {int i=x;while(i<=n){c[i]+=num;i+=lowbit(i);} } int getsum(int x)//求和 {int sum=0;while (x>0){sum+=c[x];x-=lowbit(x);}return sum; } int main() {scanf("%d",&n);for (int i=1;i<n;i++){scanf("%d%d",&x,&a[i].to);a[i].next=ls[x];ls[x]=i;//插入邊change(i,1);//改值}change(n,1);dfs(1);//后序遍歷scanf("%d",&m);for (int i=1;i<=m;i++){scanf("\n%c %d",&cc,&x);if (cc=='C'){apple[x]=!apple[x];if (apple[x])change(mark[x],-1);else change(mark[x],1);//該值取反}else{printf("%d\n",getsum(mark[x])-getsum(begin[x]));//輸出}} }總結
以上是生活随笔為你收集整理的P3321-Apple Tree【树状数组】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RISC-V 领军企业 SiFive 谈
- 下一篇: 飞傲翡声 JT1 高保真头戴耳机发布:5