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
 1 #include<cmath>
 2 #include<cstdio>
 3 #define maxn  300000
 4 class Node{
 5 public:
 6     int l,r;
 7     __int64 add;//附加值
 8     __int64 sum;
 9 }node[maxn];
10 int getRight(int n){//获得满足2^x>=n的最小x[从0层开始,给编号获得层数]
11     return ceil(log10(n*1.0)/log10(2.0));
12 }
13 void build(int l,int r,int num){//输入区间[1,2^getRight(n)],num=1建树
14     if(l==r){
15         node[num].l=node[num].r=l;node[num].add=0;node[num].sum=0;
16         return;
17     }
18     node[num].l=l;node[num].r=r;node[num].add=0;node[num].sum=0;
19     build(l,(l+r)/2,num*2);
20     build((l+r)/2+1,r,num*2+1);
21 }
22 void add(int o,int l,int r,__int64 v){//从o节点开始递归[只要调用时o=1即可]在区间[l,r]全部加v
23     if(l<=node[o].l && r>=node[o].r){//全覆盖[递归边界]
24         node[o].add+=v;
25     }else{
26         int M=node[o].l+(node[o].r-node[o].l)/2;
27         if(r<=M)add(o*2,l,r,v);
28         else if(l>M)add(o*2+1,l,r,v);
29         else{
30             add(o*2,l,M,v);
31             add(o*2+1,M+1,r,v);
32         }
33     }
34     //维护节点o
35     if(node[o].l!=node[o].r){//如果区间只是一个元素就不算
36         node[o].sum=node[2*o].sum+node[2*o+1].sum;
37     }else node[o].sum=0;
38     node[o].sum+=node[o].add*(node[o].r-node[o].l+1);
39 }
40
41 //这里addadd是从上往下这条路的累计addadd值[一同回溯记录这条路节点所有add之和,减少了一次回溯累加add值]
42 //初始时直接令其为0
43 __int64 sum=0;
44 void ask(int o,int l,int r,__int64 addadd){//从o节点开始递归[只要调用时o=1即可]在区间[l,r]的和
45     if(l<=node[o].l && r>=node[o].r){//全覆盖[递归边界]
46         sum+=(node[o].sum+addadd*(node[o].r-node[o].l+1));
47     }else{
48         int M=node[o].l+(node[o].r-node[o].l)/2;
49         if(r<=M)ask(o*2,l,r,node[o].add+addadd);
50         else if(l>M)ask(o*2+1,l,r,node[o].add+addadd);
51         else{
52             ask(o*2,l,M,node[o].add+addadd);
53             ask(o*2+1,M+1,r,node[o].add+addadd);
54         }
55     }
56 }
57 int main(){
58     int N;
59     int i,j;
60     while(scanf("%d",&N) && N){
61         build(1,1<<getRight(N),1);
62         for(int k=0;k<N;k++){
63             scanf("%d%d",&i,&j);
64             add(1,i,j,1);
65         }
66         sum=0;
67         ask(1,1,1,0);
68         printf("%lld",sum);
69         for(i=2;i<=N;i++){
70             sum=0;
71             ask(1,i,i,0);
72             printf(" %lld",sum);
73         }
74         printf("\n");
75     }return 0;
76 }
本文转自beautifulzzzz博客园博客,原文链接:http://www.cnblogs.com/zjutlitao/p/3700349.html,如需转载请自行联系原作者

[ACM_数据结构] Color the ball [线段树水题][数组开大]相关推荐

  1. HDU 1556 Color the Ball 线段树 题解

    本题使用线段树自然能够,由于区间的问题. 这里比較难想的就是: 1 最后更新须要查询全部叶子节点的值,故此须要使用O(nlgn)时间效率更新全部点. 2 截取区间不能有半点差错.否则答案错误. 这两点 ...

  2. 玲珑杯 1164 - 战舰萝莉 线段树水题

    点击打开链接 DESCRIPTION 在大战之后,法力浮·鳝AK迅速驾船驶向北海.当然他知道水之灵不可能那么容易得到,正如爱迪生曾说过:"要把BOSS打倒就要准备足够的等级."所以 ...

  3. HDU-1556-Color the ball (线段树和差分数组两种解法)

    N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的"小飞鸽"牌电动车从气球a开始到气球b依次给每个气球涂一 ...

  4. hdu 1556 Color the ball 线段树 区间更新

    水一下 #include <bits/stdc++.h> #define lson l, m, rt<<1 #define rson m+1, r, rt<<1|1 ...

  5. hdu1305 字典树水题

    题意:      给你一些字符串,然后问你他们中有没有一个串是另一个串的前缀. 思路:       字典树水题,(这种水题如果数据不大(这个题目不知道大不大,题目没说估计不大),hash下也行,把每个 ...

  6. 线段树模板题3:区间染色问题

    1.3线段树模板题3:区间染色问题 在DotA游戏中,帕吉的肉钩实际上是大多数英雄中最恐怖的东西.挂钩由长度相同的几个连续的金属棍组成. 现在,帕吉(Pudge)希望对挂接进行一些操作. 让我们将钩子 ...

  7. J.哭泣的阿木木(线段树模板题)

    哭泣的阿木木 Description 没啥用的背景故事: 在远古的恕瑞玛,有一个孤独而又忧郁的灵魂,阿木木.他在世间游荡,只为找到一个朋友.他遭受了一种远古的巫术诅咒,注定忍受永世的孤单,因为被他触碰 ...

  8. UVA 12086 Potentiometers(线段树裸题)

    题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...

  9. Color the ball(树状数组区间更新+单点求值)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1556 Color the ball Time Limit: 9000/3000 MS (Java/Ot ...

最新文章

  1. 配置网口相机(大恒水星相机)
  2. 编写实现atoi函数
  3. framework7 1.3.5 路由跳转后DOM失效问题
  4. 【渝粤教育】广东开放大学 网络市场与预测 形成性考核 (23)
  5. python matplotlib画散点图_python matplotlib库绘制散点图例题解析
  6. 操作系统和Linux
  7. linux 列出当前视频设备,如何获取Linux(ubuntu)上的视频捕获设备(网络摄像机)列表?(C / C ++)...
  8. Python爬虫 --- 2.2 Scrapy 选择器的介绍
  9. poj - problem 3070 Fibonacci 【矩阵 +快速幂】
  10. vn.py开源量化交易程序开发框架
  11. 微信秘笈之--微信多开
  12. 【基于机器视觉与深度学习的人机对弈机器人——决策篇】
  13. appstore上架所需截屏的制作方法
  14. session是什么 PHP使用session
  15. replicate vs duplicate
  16. Supporting Online Material for Lab Experiments for the Study of Social-Ecological Systems
  17. CGB2106-Day03
  18. 【Google Earth Studio】进阶编辑技巧
  19. 【坑点】Intellij Idea 出现“Unable to parse template”问题
  20. FLASH--M25P40/M25P10

热门文章

  1. openwrt 设置samba服务器与pc共享文件
  2. C语言笔记(数组地址一些细节)
  3. xcode调试打印QString
  4. 如何提高VS2010的性能,VS2010不再…
  5. SQLite 3.7.13的加密解密(二)—— 开放宏定义
  6. webkit-box translate 的组合--流畅的滑动体验
  7. android用户界面-事件处理
  8. 大数据_Flink_流式处理_简介_为什么要用Flink---Flink工作笔记0002
  9. 自己关于pytorch transfomers 的一个误区
  10. 屏幕监控中捕获鼠标位置信息