题意:容易理解。

分析:时隔很久,再一次写了一道线段树的代码,之前线段树的题也做了不少,包括各种延迟标记,但是在组队分任务之后,我们队的线段树就交给了另外一个队友在搞,

然后我就一直没去碰线段树的题了,但是我现在发现这种做法不是很好,导致我现在的思维受到了很大的局限性,所以我现在想纠正这种错误,该做的就应该去做,就像

高中一样不能太偏科!一道比较简单的线段树延迟标记!

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<cmath>
  6.  
  7. struct node{
  8. int l , r;
  9. int sum;
  10. int color;
  11. }tree[*];
  12.  
  13. int n,len,a[];
  14.  
  15. void buildTree(int l,int r,int n)
  16. {
  17. int mid = (l + r) >> ;
  18. tree[n].l = l;
  19. tree[n].r = r;
  20. tree[n].color = ;
  21. if(l == r)
  22. {
  23. tree[n].sum = a[l];
  24. return ;
  25. }
  26.  
  27. buildTree(l,mid,n*);
  28. buildTree(mid+,r,n*+);
  29. tree[n].sum = tree[n*].sum + tree[n*+].sum;
  30. }
  31.  
  32. void pushDown(int n)
  33. {
  34. tree[n*].sum = tree[n*].sum - (tree[n*].r - tree[n*].l + ) * tree[n].color;
  35. tree[n*+].sum = tree[n*+].sum - (tree[n*+].r - tree[n*+].l + ) * tree[n].color;
  36. tree[n*].color += tree[n].color;
  37. tree[n*+].color += tree[n].color;
  38. }
  39.  
  40. int calSum(int x,int y,int n)
  41. {
  42. int mid = (tree[n].l + tree[n].r) >> ;
  43. if(tree[n].l==x && tree[n].r == y)
  44. return tree[n].sum;
  45. if(tree[n].color)
  46. {
  47. pushDown(n);
  48. tree[n].color = ;
  49. }
  50.  
  51. if(y <= mid)
  52. return calSum(x , y , n*);
  53. else if(x>mid)
  54. return calSum(x , y , n*+);
  55. else
  56. return calSum(x , mid , n*) + calSum(mid+ , y , n*+);
  57. }
  58.  
  59. void update(int x , int y , int n)
  60. {
  61. int mid = (tree[n].l + tree[n].r) >> ;
  62.  
  63. if(tree[n].l == x && tree[n].r == y)
  64. {
  65. tree[n].sum = tree[n].sum - (tree[n].r - tree[n].l + );
  66. tree[n].color ++;
  67. return ;
  68. }
  69. if(y <= mid)
  70. update(x , y , n*);
  71. else if(x > mid)
  72. update(x , y , n*+);
  73. else
  74. {
  75. update(x , mid , n*);
  76. update(mid+ , y , n*+);
  77. }
  78. tree[n].sum = tree[n*].sum + tree[n* + ].sum;
  79. }
  80.  
  81. int main()
  82. {
  83. int i,q,x;
  84. while(scanf("%d%d%d",&n,&len,&q)!=EOF)
  85. {
  86. for(i=;i<=n;i++)
  87. scanf("%d",&a[i]);
  88. buildTree(,n,);
  89. while(q--)
  90. {
  91. scanf("%d",&x);
  92. printf("%d\n",calSum(x , x+len- , ));
  93. update(x , x+len- , );
  94. }
  95. }
  96. return ;
  97. }

FZU 2171(线段树的延迟标记)的更多相关文章

  1. FZU 2171 线段树 区间更新求和

    很模板的题 在建树的时候输入 求和后更新 #include<stdio.h> #include<string.h> #include<algorithm> #inc ...

  2. poj 3468 A Simple Problem with Integers 线段树加延迟标记

    A Simple Problem with Integers   Description You have N integers, A1, A2, ... , AN. You need to deal ...

  3. 线段树初步&&lazy标记

    线段树 一.概述: 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点. 对于线段树中的每一个非叶子节点[a,b],它的左儿子表示的区间为[a, ...

  4. Fast Arrangement (线段树,延迟标志)

    个人心得:线段树的延迟标志确实是减少了很多时间,思想比较简单,但是实现得时候和建立延迟的时候比较麻烦. 按照我的一些理解,就是更新时找到完全覆盖的区间时,更新延迟标志,不再往下更新,但此时父节点啥的都 ...

  5. 【BZOJ-2892&1171】强袭作战&大sz的游戏 权值线段树+单调队列+标记永久化+DP

    2892: 强袭作战 Time Limit: 50 Sec  Memory Limit: 512 MBSubmit: 45  Solved: 30[Submit][Status][Discuss] D ...

  6. BZOJ 1798 (线段树||分块)的标记合并

    我原来准备做方差的.. 结果发现不会维护两个标记.. 就是操作变成一个 a*x+b ,每次维护a , b 即可 加的时候a=1 ,b=v 乘的时候a=v ,b=0 #include <cstdi ...

  7. POJ 3237 Tree (树链剖分 路径剖分 线段树的lazy标记)

    题目链接:http://poj.org/problem?id=3237 一棵有边权的树,有3种操作. 树链剖分+线段树lazy标记.lazy为0表示没更新区间或者区间更新了2的倍数次,1表示为更新,每 ...

  8. hdu 1828 Picture(线段树 || 普通hash标记)

    http://acm.hdu.edu.cn/showproblem.php?pid=1828 Picture Time Limit: 6000/2000 MS (Java/Others)    Mem ...

  9. poj3468 线段树的懒惰标记

    题目链接:poj3468 题意:给定一段数组,有两种操作,一种是给某段区间加c,另一种是查询一段区间的和 思路:暴力的方法是每次都给这段区间的点加c,查询也遍历一遍区间,复杂度是n*n,肯定过不去,另 ...

随机推荐

  1. Linux Shell查看磁盘分区,内存使用,CPU使用率

    Linux Shell查看磁盘分区,内存使用,CPU使用率 #!/bin/bash #disk_used_rate Location=/dev/xvdb Disk_Used_Rate=$(df -h ...

  2. iOS开发--自动布局

    距离左边的: 距离顶部的: 距离右边的: 距离底部的:

  3. Bootstrap下拉菜单dropdown-menu

    1.步骤 (1)要做为下拉菜单的li增加class="dropdown" (2)为li中文字添加超链接<a data-toggle="dropdown" ...

  4. photoshopCS4换中文

    有些朋友的安装的时候可能安装界面是全中文的,安装完软件是英文的. 下载这个中文包, http://download.csdn.net/download/tuberose1605/5171091 解压后 ...

  5. RedHat7 部署ELK日志分析系统

    一.ELK的组成二.工作流程三.环境准备四.正式安装 一.ELK的组成 ELK由ElasticSearch.Logstash和Kibana三部分组成,每一部分的功能及特点如下图所示: 二.工作流程 在 ...

  6. WebService另一种轻量级实现—Hessian 学习笔记

    最近和同事聊天,得知他们在使用一种叫做Hessian的WebService实现方式实现远 程方法调用,是轻量级的,不依赖JavaEE容器,同时也是二进制数据格式传输,效率比SOAP的XML方式要高.感 ...

  7. form提交的时候使用method=get导致乱码

    一个a.jsp提交给b.jsp, b.jsp中使用 request.setCharacterEncoding("UTF-8"); 解决乱码 a.jsp中的form忘了写method ...

  8. Android基础之用Eclipse搭建Android开发环境和创建第一个Android项目(Windows平台)

    一.搭建Android开发环境 准备工作:下载Eclipse.JDK.Android SDK.ADT插件 下载地址:Eclipse:http://www.eclipse.org/downloads/ ...

  9. poj: 3253

    这题一开始从大往小考虑是行不通的,这个时候从小到大考虑就很容易了.用一个priority_queue选出两个最小的值加到结果里再推回queue里,直到queue空为止.注意这里res要用long lo ...

  10. Introduction

    http://www.entityframeworktutorial.net/EntityFramework5/entity-framework5-introduction.aspx Basics o ...