题目连接:http://www.spoj.com/problems/MULTQ3/

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #define lson rt<<1,L,mid
  5. #define rson rt<<1|1,mid+1,R
  6. /*
  7. 题意:给出n个数,初试为0,给出两个操作;
  8. 0 A B :将[A,B]区间中的每个数+1
  9. 1 A B :询问[A,B]区间中有多少个能被3整除的数。
  10. 思路:每个节点存储三个值:num0:整除3的个数,num1:除以3余1的个数,num2:除以3余2的个数
  11. 更新的时候,只要将这三个值互换即可
  12. */
  13. using namespace std;
  14. const int maxn=;
  15. int n,m;
  16.  
  17. struct Node{
  18. //num0:整除3的个数,num1:除以3余1的个数,num2:除以3余2的个数
  19. int num0,num1,num2;
  20. int lazy; //标记该区间+1的次数,如果三次+1相当于不变
  21. }tree[maxn<<];
  22.  
  23. void build(int rt,int L,int R){
  24. tree[rt].num0=(R-L+);
  25. tree[rt].num1=tree[rt].num2=;
  26. tree[rt].lazy=;
  27. if(L==R)
  28. return;
  29. int mid=(R+L)>>;
  30. build(lson);
  31. build(rson);
  32. }
  33. void pushUp(int rt){
  34. tree[rt].num0=tree[rt<<].num0+tree[rt<<|].num0;
  35. tree[rt].num1=tree[rt<<].num1+tree[rt<<|].num1;
  36. tree[rt].num2=tree[rt<<].num2+tree[rt<<|].num2;
  37. }
  38. void pushDown(Node &rt,Node &ls,Node &rs){
  39. if(rt.lazy==){
  40. /*
  41. +1一次:
  42. num0->num1
  43. num1->num2
  44. num2->num0
  45. */
  46. int tmp;
  47. tmp=ls.num0;
  48. ls.num0=ls.num2;
  49. ls.num2=ls.num1;
  50. ls.num1=tmp;
  51. ls.lazy=(ls.lazy+rt.lazy)%;
  52.  
  53. tmp=rs.num0;
  54. rs.num0=rs.num2;
  55. rs.num2=rs.num1;
  56. rs.num1=tmp;
  57. rs.lazy=(rs.lazy+rt.lazy)%;
  58.  
  59. rt.lazy=;
  60. }
  61. else if(rt.lazy==){
  62. /*
  63. +1二次:
  64. num0->num2
  65. num2->num1
  66. num1->num0
  67. */
  68. int tmp;
  69. tmp=ls.num0;
  70. ls.num0=ls.num1;
  71. ls.num1=ls.num2;
  72. ls.num2=tmp;
  73. ls.lazy=(ls.lazy+rt.lazy)%;
  74.  
  75. tmp=rs.num0;
  76. rs.num0=rs.num1;
  77. rs.num1=rs.num2;
  78. rs.num2=tmp;
  79. rs.lazy=(rs.lazy+rt.lazy)%;
  80. rt.lazy=;
  81. }
  82. }
  83. void update(int rt,int L,int R,int l,int r){
  84. if(l<=L&&R<=r){
  85. int tmp;
  86. tmp=tree[rt].num0;
  87. tree[rt].num0=tree[rt].num2;
  88. tree[rt].num2=tree[rt].num1;
  89. tree[rt].num1=tmp;
  90. tree[rt].lazy=(tree[rt].lazy+)%;
  91. return;
  92. }
  93. pushDown(tree[rt],tree[rt<<],tree[rt<<|]);
  94. int mid=(L+R)>>;
  95. if(l<=mid)
  96. update(lson,l,r);
  97. if(r>mid)
  98. update(rson,l,r);
  99. pushUp(rt);
  100. }
  101. int query(int rt,int L,int R,int l,int r){
  102. if(l<=L&&R<=r){
  103. return tree[rt].num0;
  104. }
  105. pushDown(tree[rt],tree[rt<<],tree[rt<<|]);
  106. int ret=;
  107. int mid=(L+R)>>;
  108. if(l<=mid)
  109. ret+=query(lson,l,r);
  110. if(r>mid)
  111. ret+=query(rson,l,r);
  112. return ret;
  113. }
  114. int main()
  115. {
  116. int t,a,b;
  117. scanf("%d%d",&n,&m);
  118. build(,,n);
  119. for(int i=;i<=m;i++){
  120. scanf("%d%d%d",&t,&a,&b);
  121. a++;b++;
  122. if(t==){
  123. update(,,n,a,b);
  124. }
  125. else{
  126. int ans=query(,,n,a,b);
  127. printf("%d\n",ans);
  128. }
  129. }
  130. return ;
  131. }

SPOJ MULTQ3 7299 Multiples of 3 (区间更新)的更多相关文章

  1. HDU 4348.To the moon SPOJ - TTM To the moon -可持久化线段树(带修改在线区间更新(增减)、区间求和、查询历史版本、回退到历史版本、延时标记不下放(空间优化))

    To the moon Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

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

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

  3. hihoCoder 1080 : 更为复杂的买卖房屋姿势 线段树区间更新

    #1080 : 更为复杂的买卖房屋姿势 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho都是游戏迷,“模拟都市”是他们非常喜欢的一个游戏,在这个游戏里面他们 ...

  4. hdu 3397 Sequence operation(线段树:区间更新)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3397 题意:给你一个长度为n的0,1序列,支持下列五种操作, 操作0(0 a b):将a到b这个区间的 ...

  5. 【HDU 4614】Vases and Flowers(线段树区间更新懒惰标记)

    题目0到n-1的花瓶,操作1在下标a开始插b朵花,输出始末下标.操作2清空[a,b]的花瓶,求清除的花的数量.线段树懒惰标记来更新区间.操作1,先查询0到a-1有num个空瓶子,然后用线段树的性质,或 ...

  6. HDU 1698 Just a Hook(线段树/区间更新)

    题目链接: 传送门 Minimum Inversion Number Time Limit: 1000MS     Memory Limit: 32768 K Description In the g ...

  7. HDU 5023 A Corrupt Mayor's Performance Art(线段树区间更新)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5023 解题报告:一面墙长度为n,有N个单元,每个单元编号从1到n,墙的初始的颜色是2,一共有30种颜色 ...

  8. HDU 4902 Nice boat 2014杭电多校训练赛第四场F题(线段树区间更新)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4902 解题报告:输入一个序列,然后有q次操作,操作有两种,第一种是把区间 (l,r) 变成x,第二种是 ...

  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. nyoj71--独木舟上的旅行

    描述 进行一次独木舟的旅行活动,独木舟可以在港口租到,并且之间没有区别.一条独木舟最多只能乘坐两个人,且乘客的总重量不能超过独木舟的最大承载量.我们要尽量减少这次活动中的花销,所以要找出可以安置所有旅 ...

  2. Model Builder中Table2Table中字段映射的问题

    ArcGIS10中使用过程中,Bug不少.尽管有了SP3,但模型耦合的深层次的应用中还是错误不少.目前只是遇到一个,利用躲避的方法解决一个.例如,从NetCDF中抽出的数据表,必须在内存和数据库中都存 ...

  3. exynos 4412 eMMC配置及使用方法

    /** ****************************************************************************** * @author    Maox ...

  4. 简单的jQuery获取URL的?后带的参数

    var con_name = getQueryString("con_name"); //接收con_name        function getQueryString(val ...

  5. jdbc 连接 mysql 获取 数据集 条数

    package nona; import java.io.IOException; import java.io.PrintWriter; import java.sql.Connection; im ...

  6. Microsoft Azure Preview portal 以及Preview Features介绍

    首先mooncake版本并不提供此类功能. 国际版会把将来推出的功能提供Preview,而且是免费的,有想研究未来技术以及的同学可以尝试 通过以下地址进入国际版,往下拉 http://azure.mi ...

  7. linux 获取cpu 个数

    sysconf( )有unistd.h提供,要使用该函数需要#include<unistd.h>,其参数可以是_SC_NPROCESSORS_CONF,也可以是_SC_NPROCESSOR ...

  8. Oracle中的注释

    注释用于对程序代码的解释说明,它能够增强程序的可读性,是程序易于理解. 单行注释: 用“--”,后面跟上注释的内容 Declare Num_sal number; --声明一个数字类型的变量 Var_ ...

  9. php protected只能被继承,不可以在实例中调用,parent::调用父类(子类函数的重载对父类的函数没有影响)

    <?php class a { private function fun1(){ echo 'a1'; } //protected 可以被继承,但是只能在子类中使用,不能被实例化调用 prote ...

  10. POJ 2315 最小费用最大流

    从1走到N然后从N走回来的最短路程是多少? 转换为费用流来建模. 1: /** 2: 因为e ==0 所以 pe[v] pe[v]^1 是两条相对应的边 3: E[pe[v]].c -= aug; E ...