zoukankan      html  css  js  c++  java
  • C++-POJ3321-Apple Tree[数据结构][树状数组]

    树上的单点修改+子树查询

    用dfn[u]和num[u]可以把任意子树表示成一段连续区间,此时结合树状数组就好了

    #include <set>
    #include <map>
    #include <cmath>
    #include <queue>
    #include <vector>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    const int MAXN=(int)1e5+1;
    const int MAXM=(int)2e5+1;
    int a[MAXN],n,m;char s[5];
    int lb(int i){return i&-i;}//lowbit
    void add(int i,int v){for(;i<=n;a[i]+=v,i+=lb(i));}
    int sum(int i){int ans=0;for(;i;ans+=a[i],i-=lb(i));return ans;}
    int query(int i,int j){return sum(j)-sum(i-1);}
    
    struct node{int v,next;}edge[MAXM];
    int head[MAXN],cnt;
    void addedge(int u,int v){edge[++cnt].v=v,edge[cnt].next=head[u],head[u]=cnt;}
    void Addedge(int u,int v){addedge(u,v),addedge(v,u);}
    
    int dfn[MAXN],num[MAXN],index;
    void dfs(int u,int fa){
        dfn[u]=++index;
        for(int i=head[u];i;i=edge[i].next){
            int v=edge[i].v;
            if(v!=fa)num[u]++,dfs(v,u),num[u]+=num[v];
        }
    }
    
    void Order_C(int x){query(dfn[x],dfn[x])?add(dfn[x],-1):add(dfn[x],1);}
    void Order_Q(int x){printf("%d
    ",query(dfn[x],dfn[x]+num[x]));}
    
    int main() {
        scanf("%d",&n);
        for(int i=1,u,v;i<n;i++)scanf("%d%d",&u,&v),Addedge(u,v);
        dfs(1,1),scanf("%d",&m);
        for(int i=1;i<=n;i++)add(i,1);
        for(int i=1,x;i<=m;i++)scanf("%s%d",s,&x),s[0]=='C'?Order_C(x):Order_Q(x);
        return 0;
    }
    ~~Jason_liu O(∩_∩)O
  • 相关阅读:
    centos tar压缩与解压缩命令大全
    Nginx编译安装(Centos)
    Nginx的启动脚本(Centos)
    ffmpeg 音频转换(amr2mp3)
    免费国内外"代码托管服务器"收集
    cocos2dx 字符串拼接
    cocos2dx 3.0 中文 iconv 转换函数
    cocos2dx -- 学习笔记
    游戏设计
    梦想经不起等待 -- 美文转载
  • 原文地址:https://www.cnblogs.com/JasonCow/p/12288654.html
Copyright © 2011-2022 走看看