这题整整debug了两个小时

不同组居然要初始化  本以为built函数里面已经初始化好了!!!!!

其他无需注意

  1. #include<cstdio>
  2. #include<cstring>
  3. using namespace std;
  4. int n,p,a,b,m,x,y,ans;
  5. struct node
  6. {
  7. int l,r,w,f;
  8. }tree[];
  9. inline void build(int k,int ll,int rr)//建树
  10. {
  11. tree[k].l=ll,tree[k].r=rr;
  12. if(tree[k].l==tree[k].r)
  13. {
  14. tree[k].w=;
  15. return;
  16. }
  17. int m=(ll+rr)/;
  18. build(k*,ll,m);
  19. build(k*+,m+,rr);
  20. tree[k].w=tree[k*].w+tree[k*+].w;
  21. }
  22. inline void down(int k)//标记下传
  23. {
  24. tree[k*].f+=tree[k].f;
  25. tree[k*+].f+=tree[k].f;
  26. tree[k*].w+=tree[k].f*(tree[k*].r-tree[k*].l+);
  27. tree[k*+].w+=tree[k].f*(tree[k*+].r-tree[k*+].l+);
  28. tree[k].f=;
  29. }
  30. inline void ask_point(int k)//单点查询
  31. {
  32. if(tree[k].l==tree[k].r)
  33. {
  34. ans=tree[k].w;
  35. return ;
  36. }
  37. if(tree[k].f) down(k);
  38. int m=(tree[k].l+tree[k].r)/;
  39. if(x<=m) ask_point(k*);
  40. else ask_point(k*+);
  41. }
  42.  
  43. inline void change_interval(int k)//区间修改
  44. {
  45. if(tree[k].l>=a&&tree[k].r<=b)
  46. {
  47. tree[k].w+=(tree[k].r-tree[k].l+)*y;
  48. tree[k].f+=y;
  49. return;
  50. }
  51. if(tree[k].f) down(k);
  52. int m=(tree[k].l+tree[k].r)/;
  53. if(a<=m) change_interval(k*);
  54. if(b>m) change_interval(k*+);
  55. tree[k].w=tree[k*].w+tree[k*+].w;
  56. }
  57. int main()
  58. {
  59. while(scanf("%d",&n)==&&n)
  60. {
  61. memset(tree,,sizeof(tree));
  62. build(,,n);
  63. y=;
  64. for(int i=;i<=n;i++)
  65. {
  66. scanf("%d%d",&a,&b);
  67. change_interval();
  68. }
  69. for(x=;x<n;x++)
  70. {
  71. ans=;
  72. ask_point();
  73. printf("%d ",ans);
  74. }
  75. ans=;
  76. ask_point();
  77. printf("%d\n",ans);
  78. }
  79. return ;
  80. }

可以用树状数组来做

普通的树状数组是改单点 求区间 或者改单点 求单点(做差)

但是树状数组也可以改区间 求单点 sum即为单点

每次更新为    参数~n  均+=val

  1. #include <cstdio>
  2. #include <cstring>
  3. const int maxn = ;
  4. int c[maxn],n;
  5. int Lowbit(int x)
  6. {
  7. return x&(-x);
  8. }
  9. void update(int k,int x)
  10. {
  11. while(k <= n)
  12. {
  13. c[k] += x;
  14. k += Lowbit(k);
  15. }
  16. }
  17. int getsum(int x)
  18. {
  19. int sum = ;
  20. while(x > )
  21. {
  22. sum += c[x];
  23. x -= Lowbit(x);
  24. }
  25. return sum;
  26. }
  27. int main()
  28. {
  29. int a,b;
  30. while(scanf("%d",&n)&&n!=)
  31. {
  32. memset(c,,sizeof(c));
  33. for(int i=; i<n; i++)
  34. {
  35. scanf("%d%d",&a,&b);
  36. update(a,);
  37. update(b+,-);
  38. }
  39. for(int i=; i<n; i++)
  40. printf("%d ",getsum(i));
  41. printf("%d\n",getsum(n));
  42. }
  43. return ;
  44. }

Color the ball HDU1556的更多相关文章

  1. (不用循环也可以记录数组里的数)Color the ball --hdu--1556

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

  2. Color the ball(HDU1556)树状数组

    每次对区间内气球进行一次染色,求n次操作后后所有气球染色次数. 树状数组,上下区间更新都可以,差别不大. 1.对于[x,y]区间,对第x-1位减1,第y位加1,之后向上统计 #include<b ...

  3. HDU1556 Color the ball & 牛客 contest 135-I 区间 [差分标记]

    一.差分标记介绍 差分标记用来解决针对区间(修改-查询)的问题,复杂度比线段树要更低.推荐这个博客. 例如,给数组中处于某个区间的数进行加减操作,然后查询某个位置上数的变化值. 二.HDU1556 C ...

  4. Color the ball(hdu1556)(hash)或(线段树,区间更新)

    Color the ball Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...

  5. HDU1556 Color the ball(差分数组)题解

    Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  6. HDU-1556:Color the ball(前缀和)

    Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  7. HDU 1556 Color the ball(线段树区间更新)

    Color the ball 我真的该认真的复习一下以前没懂的知识了,今天看了一下线段树,以前只会用模板,现在看懂了之后,发现还有这么多巧妙的地方,好厉害啊 所以就应该尽量搞懂 弄明白每个知识点 [题 ...

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

    Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

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

    Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

随机推荐

  1. MHA-手动Failover流程(传统复制&GTID复制)

    本文仅梳理手动Failover流程.MHA的介绍详见:MySQL高可用架构之MHA 一.基本环境 1.1.复制结构 VMware10.0+CentOS6.9+MySQL5.7.21 ROLE HOST ...

  2. Django学习手册 - 登录装饰器

    # 装饰器定义 def auth(func): def inner(request,*args,**kwargs): v = request.COOKIES.get("user") ...

  3. Junit的Assert用法

    package junit.framework; /** * A set of assert methods. Messages are only displayed when an assert f ...

  4. Django开发笔记三

    Django开发笔记一 Django开发笔记二 Django开发笔记三 Django开发笔记四 Django开发笔记五 Django开发笔记六 1.基于类的方式重写登录:views.py: from ...

  5. STM32F103X datasheet学习笔记---DMA

    1.前言 直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输. 无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作. 两个DMA控制器 ...

  6. kafka系列五、kafka常用java API

    引入maven包 <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka- ...

  7. 002_mtr_a network diagnostic tool

    一. mtr combines the functionality of the traceroute and ping programs in a single network diagnostic ...

  8. centos环境自动化批量安装jdk软件脚本

    自动化安装jdk软件部署脚本 准备工作: 1.在执行脚本的服务器上生成免密码公钥: 安装expect命令 yum install -y expect ssh-keygen 三次回车 2.将jdk-7u ...

  9. Day5------------系统启动流程

    一.引导顺序 BIOS--------------------->MBR-------------------->boot loader------------------------&g ...

  10. 查看Java JVM参数配置信息命令

    查看Java JVM参数配置信息命令 java -XX:+PrintCommandLineFlags jvm运行时状态的参数,可以很快找出问题所在.现在把几个命令记录一下:1. jstat这个命令对于 ...