Color the ball 线段树 区间更新但点查询
2017-05-18 17:48
375 查看
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<sstream> #include<algorithm> #include<queue> #include<deque> #include<iomanip> #include<vector> #include<cmath> #include<map> #include<stack> #include<set> #include<fstream> #include<memory> #include<list> #include<string> using namespace std; typedef long long LL; typedef unsigned long long ULL; #define MAXN 100001 #define L 31 #define INF 1000000009 #define eps 0.00000001 struct node { LL l, r, data; }T[MAXN*4+10]; LL n,a[MAXN]; LL Query(LL p, LL k) { if (T[p].l == T[p].r) return T[p].data; LL mid = (T[p].l + T[p].r) >> 1; LL sum = T[p].data; if (k <= mid) sum += Query(p << 1, k); else sum += Query(p << 1 | 1, k); return sum; } void Build(LL p, LL l, LL r) { T[p].l = l, T[p].r = r, T[p].data = 0; if (l == r) { T[p].data = a[l]; return; } LL mid = (l + r) >> 1; Build(p << 1, l, mid); Build(p <<1 | 1, mid + 1, r); } void Insert(LL p, LL l, LL r, LL num) { //cout << p << ' ' << l << ' ' << r << ' ' << num << endl; if (l <= T[p].l&&r >= T[p].r) { T[p].data += num; return; } LL mid = (T[p].l + T[p].r) / 2; if (r <= mid) Insert(p << 1, l, r, num); else if (l > mid) Insert(p << 1 | 1, l, r, num); else { Insert(p << 1, l, mid, num); Insert(p << 1 | 1, mid + 1, r, num); } } int main() { while (scanf("%lld", &n), n) { LL t1, t2; memset(a, 0, sizeof(a)); Build(1, 1, n); for (LL i = 1; i <= n; i++) { scanf("%lld%lld", &t1, &t2); Insert(1, t1, t2, 1); } for (LL i = 1; i <= n; i++) { if (i>1) printf(" "); printf("%lld", Query(1, i)); } printf("\n"); } return 0; }
| ||||||||||
Color the ballTime Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 19857 Accepted Submission(s): 9901 [align=left]Problem Description[/align] N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球a开始到气球b依次给每个气球涂一次颜色。但是N次以后lele已经忘记了第I个气球已经涂过几次颜色了,你能帮他算出每个气球被涂过几次颜色吗? [align=left]Input[/align] 每个测试实例第一行为一个整数N,(N <= 100000).接下来的N行,每行包括2个整数a b(1 <= a <= b <= N)。 当N = 0,输入结束。 [align=left]Output[/align] 每个测试实例输出一行,包括N个整数,第I个数代表第I个气球总共被涂色的次数。 [align=left]Sample Input[/align] 3 1 1 2 2 3 3 3 1 1 1 2 1 3 0 [align=left]Sample Output[/align] 1 1 1 3 2 1 [align=left]Author[/align] 8600 |
相关文章推荐
- hdu 1556 Color the ball(线段树区间更新单点查询+懒惰标记)
- HDU 1556 Color the ball(线段树区间更新区间查询模板)
- HDU.1556 Color the ball (线段树 区间更新 单点查询)
- HDU-1556-Color the ball-线段树+区间更新+单点查询
- Color the ball HDU - 1556 线段树区间更新点查询
- hdu 1556 Color the ball(线段树 区间更新单点查询)
- hdu1556 color the ball 树状数组区间更新单点查询(附线段树做法)与二维扩展
- HDU 1556 Color the ball【线段树区间更新,一次查询+数组模拟】
- HDU 1556 Color the ball 线段树 区间更新
- HDU 1156 Color the ball (线段树 区间更新)
- HDU 1556 Color the ball 线段树更新区间查点
- HDU 1556 Color the ball(线段树:区间更新)
- hdu1556 Color the ball(线段树区间更新)
- hdoj 1556 Color the ball 【线段树 + lazy区间更新】 【树状数组】
- HDU - 1556 Color the ball (线段树 + 区间更新)
- HDU 1556 Color the ball [区间更新+单点查询]
- HDU 1556 Color the ball(线段树区间更新)
- HDU 1556 Color the ball 很典型的更新区间查找点的题(线段树树状数组两种解法)
- HDu 1556 Color the ball【线段树&&树状数组】区间更新,单点查询
- HDU 1556 Color the ball(线段树的区间更新【注释】)