zoukankan      html  css  js  c++  java
  • poj3321Apple Tree(树状数组)

    http://poj.org/problem?id=3321

    刚一看题以为要建一颗树 看了下讨论说dfs

    这里dfs遍历时设的标号很好 一个low一个high 包含了以这一节点为根节点的子树结点的所有标号

     1 #include <iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<stdlib.h>
     6 using namespace std;
     7 #define N 100010
     8 #define lowbit(x) (x&(-x))
     9 struct node
    10 {
    11     int u,v,next;
    12 }ed[N<<1];
    13 int head[N],t,low[N],g,high[N],vis[N],re[N],f[N];
    14 void init()
    15 {
    16     t = 0;
    17     memset(head,-1,sizeof(head));
    18 }
    19 void add(int u,int v)
    20 {
    21     ed[t].u = u;
    22     ed[t].v = v;
    23     ed[t].next = head[u];
    24     head[u] = t;
    25     t++;
    26 }
    27 void dfs(int u)
    28 {
    29     low[u] = ++g;
    30     vis[u] = 1;
    31     int i;
    32     for(i = head[u] ; i != -1 ; i = ed[i].next)
    33     {
    34         int v = ed[i].v;
    35         if(!vis[v])
    36             dfs(v);
    37     }
    38     high[u] = g;
    39 }
    40 void add1(int i,int da)
    41 {
    42     while(i<=g)
    43     {
    44         re[i]+=da;
    45         i+=lowbit(i);
    46     }
    47 }
    48 int getsum(int i)
    49 {
    50     int sum = 0;
    51     while(i)
    52     {
    53         sum+=re[i];
    54         i-=lowbit(i);
    55     }
    56     return sum;
    57 }
    58 int main()
    59 {
    60     int i,j,k,n,m,a,b;
    61     char s[5];
    62     init();
    63     scanf("%d",&n);
    64     for(i = 1; i < n ; i++)
    65     {
    66         scanf("%d%d",&a,&b);
    67         add(a,b);
    68         add(b,a);
    69     }
    70     dfs(1);
    71     for(i = 1 ; i <= g ; i++)
    72     {
    73         f[i] = -1;
    74         add1(i,1);
    75     }
    76     scanf("%d",&m);
    77     while(m--)
    78     {
    79         scanf("%s %d",s,&k);
    80         if(s[0]=='Q')
    81         {
    82             printf("%d
    ",getsum(high[k])-getsum(low[k]-1));
    83         }
    84         else
    85         {
    86             add1(low[k],f[k]);
    87             f[k] = f[k]*-1;
    88         }
    89     }
    90     return 0;
    91 }
    View Code
  • 相关阅读:
    Java 技术笔记
    idea启动TOMCAT html 乱码
    IntelliJ IDEA 导入新项目
    InterlliJ Debug方式启动:method breakpoints may dramatically show down debugging
    intelliJ idea #region 代码折叠
    Console 程序在任务计划程序无法读写文件
    Java 发送邮件
    MySQL 索引
    MySQL 临时表
    11 帧差法获取运动
  • 原文地址:https://www.cnblogs.com/shangyu/p/3223604.html
Copyright © 2011-2022 走看看