HDU 1556 Color the ball 线段树

HDU 1556 Color the ball

线段树模版题,存个模板

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <fstream>
 4 #include <algorithm>
 5 #include <cmath>
 6 #include <deque>
 7 #include <vector>
 8 #include <queue>
 9 #include <string>
10 #include <cstring>
11 #include <map>
12 #include <stack>
13 #include <set>
14 #define LL long long
15 #define eps 1e-8
16 #define INF 0x3f3f3f3f
17 #define MAXN 100005
18 using namespace std;
19 int sum[MAXN * 3], add[MAXN * 3];
20 void pushup(int t){
21     sum[t] = sum[t << 1] + sum[t << 1 | 1];
22 }
23 void pushdown(int t, int x){
24     if (add[t]){
25         add[t << 1] += add[t];
26         add[t << 1 | 1] += add[t];
27         sum[t << 1] += ((x + 1) >> 1)* add[t];
28         sum[t << 1 | 1] += (x >> 1) * add[t];
29         add[t] = 0;
30     }
31 }
32 void update(int L, int R, int t, int p, int q, int x){
33     if (p <= L && q >= R){
34         sum[t] += (R - L + 1) * x;
35         add[t] += x;
36         return;
37     }
38
39     pushdown(t, R - L + 1);
40     int mid = (L + R) >> 1;
41     if (p <= mid){
42         update(L, mid, t << 1, p, q, x);
43     }
44     if (q > mid){
45         update(mid + 1, R, t << 1 | 1, p, q, x);
46     }
47     pushup(t);
48 }
49 int query(int L, int R, int t, int p, int q){
50     if (p <= L && q >= R){
51         return sum[t];
52     }
53     pushdown(t, R - L + 1);
54     int mid = (L + R) >> 1;
55     int res = 0;
56     if (p <= mid){
57         res += query(L, mid, t << 1, p, q);
58     }
59     if (q > mid){
60         res += query(mid + 1, R, t << 1 | 1, p, q);
61     }
62     return  res;
63 }
64 int main()
65 {
66 #ifndef ONLINE_JUDGE
67     freopen("in.txt", "r", stdin);
68     //freopen("out.txt", "w", stdout);
69 #endif // OPEN_FILE
70     int n;
71     while (~scanf("%d", &n) && n){
72         memset(sum, 0, sizeof(sum));
73         memset(add, 0, sizeof(add));
74         int x, y;
75         for (int i = 1; i <= n; i++){
76             scanf("%d%d", &x, &y);
77             update(1, n, 1, x, y, 1);
78         }
79         for (int i = 1; i < n; i++){
80             printf("%d ", query(1, n, 1, i, i));
81         }
82         printf("%d\n", query(1, n, 1, n, n));
83     }
84 }
时间: 2024-10-17 16:38:35

HDU 1556 Color the ball 线段树的相关文章

HDU 1556 Color the ball 线段树更新区间查点

点击打开链接 Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 9120    Accepted Submission(s): 4665 Problem Description N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的"小飞鸽

hdu 1556 Color the ball(线段树区间维护+单点求值)

传送门:Color the ball Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 25511    Accepted Submission(s): 12393 Problem Description N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele

HDU 1556 Color the Ball 线段树 题解

本题使用线段树自然能够,由于区间的问题. 这里比較难想的就是: 1 最后更新须要查询全部叶子节点的值,故此须要使用O(nlgn)时间效率更新全部点. 2 截取区间不能有半点差错.否则答案错误. 这两点卡了我下.看来我的线段树还是不够熟,须要多多练习. 线段树是二分法的高级应用,可是却不是简单应用,要锻炼好并应用好线段树思维还是比二分法难非常多的. static const int SIZE = 100005; static const int TREESIZE = SIZE<<2; int a

hdu 1556 Color the ball(树状数组)

转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1556 Problem Description N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的"小飞鸽"牌电动车从气球a开始到气球b依次给每个气球涂一次颜色.但是N次以后lele已经忘记了第I个气球已经涂过几次颜色了,你能帮他算出每个气

HDU - 1556 Color the ball (一维树状数组 + 区间修改 + 单点求值)

HDU - 1556 Color the ball Time Limit: 3000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u Submit Status Description N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的"小飞鸽"牌电动车从气球a开始到气球b依次给每个气球涂一次颜色.但是N次以后lele已经忘记了第I个气

HDU 1556 Color the ball【树状数组】

题意:给出n个区间,每次给这个区间里面的数加1,询问单点的值 一维的区间更新,单点查询,还是那篇论文里面讲了的 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <cmath> 5 #include<stack> 6 #include<vector> 7 #include<map> 8 #include<set> 9 #

hdu 1556:Color the ball(线段树,区间更新,经典题)

Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 7941    Accepted Submission(s): 4070 Problem Description N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的"小飞鸽"牌电

【线段树】hdu 1556 Color the ball

[线段树]hdu 1556 Color the ball 题目链接:hdu 1556 Color the ball 题目大意 给你N个气球,不断刷新指定区间的颜色,刷新N次,最后输出每一个气球的刷新次数. 上一篇文章是线段树的点修改.区间查询: 这篇文章是线段树的区间修改.点查询: 说一下思路 线段树的区间修改:利用线段树的区间查询,查询到叶节点segTree[root].sum++,而如果对区间进行多次点修改的话,注定超时 线段树的点查询:以为用之前的区间查询就可以了,实际上还是有改变,因为原

hdu 1556:Color the ball(第二类树状数组 —— 区间更新,点求和)

Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 8984    Accepted Submission(s): 4594 Problem Description N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球