• 1556 Color the ball


    资源限制

    Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

    Problem Description
    N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球a开始到气球b依次给每个气球涂一次颜色。但是N次以后lele已经忘记了第I个气球已经涂过几次颜色了,你能帮他算出每个气球被涂过几次颜色吗?
     
    Input
    每个测试实例第一行为一个整数N,(N <= 100000).接下来的N行,每行包括2个整数a b(1 <= a <= b <= N)。
    当N = 0,输入结束。
     
    Output
    每个测试实例输出一行,包括N个整数,第i个数代表第i个气球总共被涂色的次数。
     
    Sample Input
    3
    1 1
    2 2
    3 3
    3
    1 1
    1 2
    1 3
    0
     
    Sample Output
    1 1 1
    3 2 1
     

    这是一道树状数组-[区间更新 单点查询]模板题,详情点击这里.

    把区间[a, b]内的所有值全部加上k或者减去k,然后查询某个点的值,这里我们引入差分,利用差分建树.

    以下,A[i]代表原数组,D[j]代表差分数组,规定A[0] = 0;

    则有 A[i] = Σij=1D[j]; (D[j] = A[j] - A[j-1]),即A[i]的值等于查分D[i]的前缀和.

    那么要改变区间[a, b]内的值,只需更改D[a]和D[b+1]两个值即可。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstdlib>
     4 #include <cstring>
     5 #include <string>
     6 #include <cmath>
     7 #include <algorithm>
     8 #define INF 0x3f3f3f3f
     9 #define zero 1e-7
    10 
    11 using namespace std;
    12 typedef long long ll;
    13 const ll mod=1000000007;
    14 const ll max_n=1e5+5;
    15 int c[max_n];
    16 int n;
    17 
    18 int lowbit(int x) {
    19     return x&(-x);
    20 }
    21 
    22 void update(int i, int k) {
    23     while(i<=n) {
    24         c[i]+=k;
    25         i+=lowbit(i);
    26     }
    27 }
    28 
    29 int getsum(int i) {
    30     int res=0;
    31     while(i>0) {
    32         res+=c[i];
    33         i-=lowbit(i);
    34     }
    35     return res;
    36 }
    37 
    38 int main() {
    39     while(cin>>n, n) {
    40         memset(c, 0, sizeof(c));
    41         int a, b;
    42         for(int i=1; i<=n; i++) {
    43             scanf("%d %d", &a, &b);
    44             update(a, 1);
    45             update(b+1, -1);
    46         }
    47         for(int i=1; i<=n; i++) {
    48             if(i==n) printf("%d
    ", getsum(i));
    49             else printf("%d ", getsum(i));
    50         }
    51     }
    52     return 0;
    53 }
  • 相关阅读:
    wxpython笔记:应用骨架
    go 优雅的检查channel关闭
    Golang并发模型:流水线模型
    go http数据转发
    go 互斥锁与读写锁
    go 工作池配合消息队列
    实现Tcp服务器需要考虑哪些方面
    go Goroutine泄露
    关于个人博客转移的那些事
    Java并发编程:Thread类的使用介绍
  • 原文地址:https://www.cnblogs.com/wwqzbl/p/13529745.html
Copyright © 2020-2023  润新知