分析:复杂的经营分部树。

只有一个查询操作,这是要求[l,r]的数量之间p钍总和。并不是所有的查询所有节点,会议TLE。最好的是查询部件[a。b]。所有这个区间值我们是平等的,即能返回(b-a+1)*val 的值。区间内全部值都同样的情况的区间。对于置初值和加乘操作。分两种情况:1、当为置初值操作。直接覆盖区间就可以。并把标记的加乘操作赋为初始值。2、当为加乘操作时。先推断当前区间段是否为同样的值,是的话直接加乘,维护这个同样的值就可以。假设不同样,看区间是否已有加乘标记,把这个加乘标记一直传递下去。直到遇见那个区间段区间全部值同样时停止。最后把这个加乘赋给最開始的区间段。简单的说就是,覆盖操作可直接维护,不是覆盖操作的话。区间仅仅能保留一个加乘操作。

  1. #include<iostream>
  2. using namespace std;
  3.  
  4. #define lz t<<1,l,mid //左区间
  5. #define rz (t<<1)|1,mid+1,r //右区间
  6. #define N 100005
  7. #define MOD 10007
  8. __int64 add[N<<2],mul[N<<2],chan[N<<2],sum[N<<2];
  9.  
  10. void Build(int t,int l,int r) //建立线段树
  11. {
  12. int mid;
  13.  
  14. mul[t]=1;
  15. add[t]=sum[t]=0;
  16. chan[t]=0;
  17. if(l==r)
  18. {
  19. chan[t]=1; //叶节点设为1。方便询问的查询
  20. return ;
  21. }
  22. mid=(l+r)>>1;
  23. Build(lz);
  24. Build(rz);
  25. }
  26.  
  27. void PushDown(int t,int l,int r) //标记下传
  28. {
  29. int mid;
  30.  
  31. if(l==r) return ;
  32. mid=(l+r)>>1;
  33. if(chan[t]) //set标记下传
  34. {
  35. add[t<<1]=0,mul[t<<1]=1;
  36. add[(t<<1)|1]=0,mul[(t<<1)|1]=1;
  37. chan[t<<1]=chan[(t<<1)|1]=1;
  38. sum[t<<1]=sum[(t<<1)|1]=sum[t];
  39. chan[t]=0;
  40. }
  41. else
  42. {
  43. if(add[t]) //加标记下传
  44. {
  45. if(chan[t<<1]) sum[t<<1]=(sum[t<<1]+add[t])%MOD; //左子树有set标记
  46. else
  47. {
  48. PushDown(lz); //下传
  49. add[t<<1]=(add[t<<1]+add[t])%MOD;
  50. }
  51. if(chan[(t<<1)|1]) sum[(t<<1)|1]=(sum[(t<<1)|1]+add[t])%MOD; //左子树有set标记
  52. else
  53. {
  54. PushDown(rz); //下传
  55. add[(t<<1)|1]=(add[(t<<1)|1]+add[t])%MOD;
  56. }
  57. add[t]=0;
  58. }
  59. if(mul[t]>1) //乘标记下传
  60. {
  61. if(chan[t<<1]) sum[t<<1]=(sum[t<<1]*mul[t])%MOD; //左子树有set标记
  62. else
  63. {
  64. PushDown(lz); //下传
  65. mul[t<<1]=(mul[t<<1]*mul[t])%MOD;
  66. }
  67. if(chan[(t<<1)|1]) sum[(t<<1)|1]=(sum[(t<<1)|1]*mul[t])%MOD; //左子树有set标记
  68. else
  69. {
  70. PushDown(rz); //下传
  71. mul[(t<<1)|1]=(mul[(t<<1)|1]*mul[t])%MOD;
  72. }
  73. mul[t]=1;
  74. }
  75. }
  76. }
  77.  
  78. void Update(int t,int l,int r,int ul,int ur,int c,int op)
  79. {
  80. int mid;
  81.  
  82. if(l>=ul && ur>=r) //边界
  83. {
  84. if(op==3)
  85. chan[t]=1,mul[t]=1,add[t]=0,sum[t]=c;
  86. else if(chan[t])
  87. {
  88. if(op==1) sum[t]=(sum[t]+c)%MOD;
  89. else sum[t]=(sum[t]*c)%MOD;
  90. }
  91. else
  92. {
  93. PushDown(t,l,r); //下传
  94. if(op==1) add[t]=(add[t]+c)%MOD;
  95. else mul[t]=(mul[t]*c)%MOD;
  96. }
  97. return ;
  98. }
  99. PushDown(t,l,r);
  100. mid=(l+r)>>1;
  101. if(ur<=mid) Update(lz,ul,ur,c,op);
  102. else if(ul>mid) Update(rz,ul,ur,c,op);
  103. else
  104. {
  105. Update(lz,ul,mid,c,op);
  106. Update(rz,mid+1,ur,c,op);
  107. }
  108. }
  109.  
  110. __int64 Query(int t,int l,int r,int ul,int ur,int p)
  111. {
  112. int mid,i;
  113. __int64 ans,tp,t1,t2;
  114.  
  115. if(ul<=l && r<=ur)
  116. if(chan[t])
  117. {
  118. ans=1;
  119. tp=sum[t];
  120. for(i=1;i<=p;i++) ans=(ans*tp)%MOD;
  121. return (r-l+1)*ans%MOD; //由于区间的每一个部分都是同样的
  122. }
  123. PushDown(t,l,r); //下传标记
  124. mid=(l+r)>>1;
  125. if(ur<=mid) return Query(lz,ul,ur,p);
  126. else if(ul>mid) return Query(rz,ul,ur,p);
  127. else
  128. {
  129. t1=Query(lz,ul,mid,p);
  130. t2=Query(rz,mid+1,ur,p);
  131. return (t1+t2)%MOD;
  132. }
  133. }
  134.  
  135. int main()
  136. {
  137. int n,m,i,l,r,c,op;
  138.  
  139. while(scanf("%d%d",&n,&m)==2 && n+m)
  140. {
  141. Build(1,1,n); //1为根节点
  142. for(i=1;i<=m;i++)
  143. {
  144. scanf("%d%d%d%d",&op,&l,&r,&c);
  145. if(op<=3) Update(1,1,n,l,r,c,op);
  146. else
  147. printf("%I64d\n",Query(1,1,n,l,r,c)%MOD);
  148. }
  149. }
  150. return 0;
  151. }

版权声明:本文博主原创文章。博客,未经同意不得转载。

HDU ACM 4578 Transformation-&gt;段树-间隔的变化的更多相关文章

  1. HDU 6356.Glad You Came-线段树(区间更新+剪枝) (2018 Multi-University Training Contest 5 1007)

    6356.Glad You Came 题意就是给你一个随机生成函数,然后从随机函数里确定查询的左右区间以及要更新的val值.然后最后求一下异或和就可以了. 线段树,区间最大值和最小值维护一下,因为数据 ...

  2. HDU 5649.DZY Loves Sorting-线段树+二分-当前第k个位置的数

    DZY Loves Sorting Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Oth ...

  3. HDU 4578 - Transformation - [加强版线段树]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4578 Problem Description Yuanfang is puzzled with the ...

  4. HDU 4578 Transformation (线段树区间多种更新)

    http://acm.hdu.edu.cn/showproblem.php?pid=4578 题目大意:对于一个给定序列,序列内所有数的初始值为0,有4种操作.1:区间(x, y)内的所有数字全部加上 ...

  5. HDU 4578——Transformation——————【线段树区间操作、确定操作顺序】

    Transformation Time Limit: 15000/8000 MS (Java/Others)    Memory Limit: 65535/65536 K (Java/Others)T ...

  6. HDU 4578 Transformation (线段树)

    Transformation Time Limit: 15000/8000 MS (Java/Others)    Memory Limit: 65535/65536 K (Java/Others)T ...

  7. HDU 1698 Just a Hook (段树更新间隔)

    Problem Description In the game of DotA, Pudge's meat hook is actually the most horrible thing for m ...

  8. HDU - 4578 Transformation(线段树区间修改)

    https://cn.vjudge.net/problem/HDU-4578 题意 4种操作,区间加,区间乘,区间变为一个数,求区间的和.平方和以及立方和. 分析 明显线段树,不过很麻烦..看kuan ...

  9. Hdu 4578 Transformation (线段树 分类分析)

    Transformation Time Limit: 15000/8000 MS (Java/Others)    Memory Limit: 65535/65536 K (Java/Others)T ...

随机推荐

  1. Android性能优化---布局优化

    我们从事Android开发编写布局的时候大多数是使用XML来布局,这给我们带来了方便性,这样操作可以布局界面的代码和逻辑控制的Java代码分离出来,使程序的结构更加清晰.明了.特别的复杂的布局,但是这 ...

  2. Unity3D 游戏开发构架篇 ——输入控制

    临近毕业之初.进入Unity3D这个行业,是一家小工作室.老板人非常不错,公司氛围也非常单纯.近期公司开发一款小游戏,初次上手,颇多周折,记录下自己的开发心得.主要涉及一些设计理念,互相交流. 先说下 ...

  3. Qt窗口操作函数(最大化,全屏,隐藏最大化,最小化)

    Qt窗口中的一些小技术总结 //Qt主窗口没有最小化,最大化按钮且最大化显示  int main(int argc, char *argv[]) { QApplication a(argc, argv ...

  4. java学习笔记09--反射机制

    java学习笔记09--反射机制 什么是反射: 反射是java语言的一个特性,它允许程序在运行时来进行自我检查并且对内部的成员进行操作.例如它允许一个java的类获取他所有的成员变量和方法并且显示出来 ...

  5. Java+7入门经典 - 6 扩展类与继承 Part 2/2

    6.12 设计类 1) 通过已定义的基类派生子类, 并且添加方法和数据成员来自定义子类, 创建出类的层次结构; Dog 'IS-A' Animal 2) 定义一系列没有层次结构, 由类对象作为数据成员 ...

  6. 深入应用看本质之-ICMP(1)

    在网络层的学习时我们easy忽略IP的一个字段--存活时间 以下是百度上的解释 (8)生存时间 占8位,生存时间字段经常使用的的英文缩写是TTL(Time To Live),表明是数据报在网络中的寿命 ...

  7. 以JTextPanel为例Swing的鼠标事件详解

    如下界面可以通过该界面研究一下Swing的鼠标事件: 图中用红粗线圈起来的为JtextPanel,该Panel添加了鼠标事件监听器,鼠标事件监听器有三种,分别为MouseWheelListener,M ...

  8. 数组去重Array

    var aee3=[31,42,13,19,5,11,8,13,40,39,1,8,44,15,3]; Array.prototype.unqu2=function(){ this.sort(); v ...

  9. VMware中linux与window目录共享

    在虚拟机下来实如今windows下共享一个目录: (前提已安装完毕vmtools:http://blog.csdn.net/pipisorry/article/details/21318931) 打开 ...

  10. CSS实现输入框的高亮效果-------Day50

    又到周末了,这一天天过的真快,明天应该回老家了.不知道会不会有机会进行编写.尽量争取吧,实在不想就这样间断.假设说从前会一天天无聊到爆,那如今自己应该是一天天忙的要死,欠缺了太多东西,那些浪费的时间可 ...