• 【HDOJ】1556 Color the ball


    解法一:线段树, 延迟更新.

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cstdlib>
     5 using namespace std;
     6 
     7 #define MAXN 100001
     8 #define lson l, mid, rt<<1
     9 #define rson mid+1, r, rt<<1|1
    10 
    11 int sum[MAXN<<2];
    12 int delta[MAXN<<2];
    13 
    14 void PushUp(int rt) {
    15     sum[rt] = sum[rt<<1] + sum[rt<<1|1];
    16 }
    17 
    18 void PushDown(int rt, int n) {
    19     if (delta[rt]) {
    20         delta[rt<<1] += delta[rt];
    21         delta[rt<<1|1] += delta[rt];
    22         sum[rt<<1] += delta[rt] * (n - (n>>1));
    23         sum[rt<<1|1] += delta[rt] * (n>>1);
    24         delta[rt] = 0;
    25     }
    26 }
    27 
    28 void build() {
    29     memset(sum, 0, sizeof(sum));
    30     memset(delta, 0, sizeof(delta));
    31 }
    32 
    33 void update(int ll, int rr, int l, int r, int rt) {
    34     if (ll<=l && rr>=r) {
    35         delta[rt]++;
    36         sum[rt] += r-l+1;
    37         return ;
    38     }
    39     PushDown(rt, r-l+1);
    40     int mid = (l+r)>>1;
    41     if (ll <= mid)
    42         update(ll, rr, lson);
    43     if (mid < rr)
    44         update(ll, rr, rson);
    45     PushUp(rt);
    46 }
    47 
    48 int query(int ll, int rr, int l, int r, int rt) {
    49     if (ll<=l && rr>=r) {
    50         return sum[rt];
    51     }
    52     PushDown(rt, r-l+1);
    53     int mid = (l+r)>>1, ret = 0;
    54     if (ll <= mid)
    55         ret += query(ll, rr, lson);
    56     if (mid < rr)
    57         ret += query(ll, rr, rson);
    58     return ret;
    59 }
    60 
    61 int main() {
    62     int n, a, b;
    63     int i, tmp;
    64 
    65     while (scanf("%d", &n)!=EOF && n) {
    66         build();
    67         for (i=0; i<n; ++i) {
    68             scanf("%d %d", &a, &b);
    69             update(a, b, 1, n, 1);
    70         }
    71         for (i=1; i<=n; ++i) {
    72             tmp = query(i, i, 1, n, 1);
    73             if (i != n)
    74                 printf("%d ", tmp);
    75             else
    76                 printf("%d
    ", tmp);
    77         }
    78     }
    79 
    80     return 0;
    81 }

    解法二:树状数组

     1 #include <cstdio>
     2 #include <cstring>
     3 
     4 #define MAXN 100001
     5 
     6 int sum[MAXN];
     7 int n;
     8 
     9 int lowbit(int x) {
    10     return x&(-x);
    11 }
    12 
    13 void update(int x, int delta) {
    14     while (x <= n) {
    15         sum[x] += delta;
    16         x += lowbit(x);
    17     }
    18 }
    19 
    20 int getSum(int x) {
    21     int ret = 0;
    22     while (x > 0) {
    23         ret += sum[x];
    24         x -= lowbit(x);
    25     }
    26     return ret;
    27 }
    28 
    29 int main() {
    30     int i, a, b;
    31 
    32     while (scanf("%d", &n)!=EOF && n) {
    33         memset(sum, 0, sizeof(sum));
    34         for (i=1; i<=n; ++i) {
    35             scanf("%d %d", &a, &b);
    36             update(a, 1);
    37             update(b+1, -1);
    38         }
    39         for (i=1; i<=n; ++i) {
    40             int tmp = getSum(i);
    41             if (i != n)
    42                 printf("%d ", tmp);
    43             else
    44                 printf("%d
    ", tmp);
    45         }
    46     }
    47     return 0;
    48 }
  • 相关阅读:
    【0003】与随机数有关的一些问题
    【0001】排序法与查找方式
    【0002】斐波那契数列,迷宫,汉诺塔
    【0001】C程序的编译过程
    django学习——request.POST.get(‘key’) 、 request.GET.get('key', '')
    django 删除数据库表后重新同步的方法
    Django链接mysql数据库报错1064
    sql练习题
    jmeter连接数据库
    购物车程序练习
  • 原文地址:https://www.cnblogs.com/bombe1013/p/4014690.html
Copyright © 2020-2023  润新知