zoukankan      html  css  js  c++  java
  • poj 3321

    先将树DFS一次得到一个序列,按这个顺序把节点上的苹果数放到一个一维数组,每棵子树的苹果数就相当于数组对应的一段元素的和。这个数组我们用树状数组来维护就可以加快速度。

     1 #include <cstdio>
     2 #include <algorithm>
     3 #pragma warning(disable:4996)
     4 using namespace std;
     5 int bit[100001], a[100001];//bit -- binary indexed tree
     6 int lowBit(int x){
     7     return x & (-x);
     8 }
     9 void add(int idx, int size, int val){
    10     while (idx <= size){
    11         bit[idx] += val;
    12         idx += lowBit(idx);
    13     }
    14 }
    15 int sum(int idx){
    16     int ret = 0;
    17     while (idx > 0){
    18         ret += bit[idx];
    19         idx -= lowBit(idx);
    20     }
    21     return ret;
    22 }
    23 struct Edge{
    24     int v, next;
    25 }edge[200001];
    26 int edgeNum, head[100001];
    27 void addEdge(int u, int v){
    28     edge[edgeNum].v = v;
    29     edge[edgeNum].next = head[u];
    30     head[u] = edgeNum++;
    31 }
    32 int posMap[100001][2], counter;
    33 void dfs(int u){
    34     posMap[u][0] = ++counter;
    35     for (int i = head[u]; i != -1; i = edge[i].next){
    36         if (posMap[edge[i].v][0] == -1){
    37             dfs(edge[i].v);
    38         }
    39     }
    40     posMap[u][1] = counter;
    41 }
    42 int main(){
    43     int n, m;
    44     while (~scanf("%d", &n)){
    45         int u, v;
    46         edgeNum = 0;
    47         fill(head + 1, head + 1 + n, -1);
    48         for (int i = 1; i <= n; i++){
    49             bit[i] = lowBit(i);
    50             a[i] = 1;
    51         }
    52         for (int i = 1; i < n; i++){
    53             scanf("%d%d", &u, &v);
    54             addEdge(u, v);
    55             addEdge(v, u);
    56         }
    57         for (int i = 1; i <= n; i++){
    58             posMap[i][0] = -1;
    59         }
    60         counter = 0;
    61         dfs(1);
    62         scanf("%d", &m);
    63         char op;
    64         int k;
    65         for (int i = 0; i < m; i++){
    66             scanf("%*c%c%d", &op, &k);
    67             if (op == 'Q'){
    68                 printf("%d
    ", sum(posMap[k][1]) - sum(posMap[k][0] - 1));
    69             }
    70             else{
    71                 if (a[posMap[k][0]]){
    72                     add(posMap[k][0], n, -1);
    73                 }
    74                 else{
    75                     add(posMap[k][0], n, 1);
    76                 }
    77                 a[posMap[k][0]] = 1 - a[posMap[k][0]];
    78             }
    79         }
    80     }
    81     return 0;
    82 }
  • 相关阅读:
    Flask(7)- request 对象
    2021暑假训练赛1 基于Codeforce#479(div3)
    AtCoder ARC 115 E
    C++11 noexcept 关键字用法学习
    AtCoder ABC 049 C
    【算法学习笔记】块状数据结构:分块思想
    「Codeforces 1131D」Gourmet Choice
    AtCoder Beginner Contest 172 (C题前缀和 + 二分,D题筛因子,E题容斥定理)
    第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(沈阳)补题记录
    泛型动态数组
  • 原文地址:https://www.cnblogs.com/ZShogg/p/3474914.html
Copyright © 2011-2022 走看看