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
  • 相关阅读:
    计算两个经纬度之间的距离,单位米
    PHP获取汉字首字母函数
    tp3.2 上传文件及下载文件
    最少知识原则
    单一职责原则
    接口和面向接口编程
    开放-封闭原则
    设计原则
    websrom编译器
    头条笔试题2018后端第二批-用户喜好
  • 原文地址:https://www.cnblogs.com/JasonCow/p/12288654.html
Copyright © 2011-2022 走看看