没什么说的裸线段树,注意细节就好了!!!

代码如下:

  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<algorithm>
  4. #include<iomanip>
  5. #include<cmath>
  6. #include<cstring>
  7. #include<vector>
  8. #define ll __int64
  9. #define pi acos(-1.0)
  10. #define MAX 100003
  11. #define M 10007
  12. #define lson i<<1
  13. #define rson i<<1|1
  14. using namespace std;
  15. struct tree
  16. {
  17. int l,r,sum[],add,mul;
  18. void init(int _l,int _r){
  19. l=_l;r=_r;mul=;add=;
  20. }
  21. void Add(int a){
  22. sum[]=(sum[]+a*a%M*a%M*len()%M+*a*sum[]%M+*a*a%M*sum[]%M)%M;
  23. sum[]=(sum[]+a*a%M*len()%M+*a*sum[]%M)%M;
  24. sum[]=(sum[]+a*len()%M)%M;
  25. add=(add+a)%M;
  26. }
  27. void Mul(int a){
  28. sum[]=sum[]*a%M*a%M*a%M;
  29. sum[]=sum[]*a%M*a%M;
  30. sum[]=sum[]*a%M;
  31. add=add*a%M;
  32. mul=mul*a%M;
  33. }
  34. int len(){
  35. return r-l+;
  36. }
  37. int mid(){
  38. return (l+r)>>;
  39. }
  40. }T[MAX*];
  41. void down(int i)
  42. {
  43. T[lson].Mul(T[i].mul);
  44. T[rson].Mul(T[i].mul);
  45. T[lson].Add(T[i].add);
  46. T[rson].Add(T[i].add);
  47. T[i].add=;
  48. T[i].mul=;
  49. }
  50. void updateson(int i)
  51. {
  52. for(int j=;j<;j++)
  53. T[i].sum[j]=(T[lson].sum[j]+T[rson].sum[j])%M;
  54. }
  55. void built(int i,int l,int r)
  56. {
  57. T[i].init(l,r);
  58. memset(T[i].sum,,sizeof(T[i].sum));
  59. if(l==r) return ;
  60. int m=T[i].mid();
  61. built(lson,l,m);
  62. built(rson,m+,r);
  63. }
  64. void update(int i,int l,int r,int mul,int add)
  65. {
  66. if(T[i].l==l&&T[i].r==r){
  67. T[i].Mul(mul);
  68. T[i].Add(add);
  69. return ;
  70. }
  71. down(i);
  72. int m=T[i].mid();
  73. if(r<=m) update(lson,l,r,mul,add);
  74. else if(l>m) update(rson,l,r,mul,add);
  75. else{
  76. update(lson,l,m,mul,add);
  77. update(rson,m+,r,mul,add);
  78. }
  79. updateson(i);
  80. }
  81. int query(int i,int l,int r,int p)
  82. {
  83. if(T[i].l==l&&T[i].r==r) return T[i].sum[p-];
  84. down(i);
  85. int m=T[i].mid();
  86. if(r<=m) return query(lson,l,r,p);
  87. else if(l>m) return query(rson,l,r,p);
  88. else return (query(lson,l,m,p)+query(rson,m+,r,p))%M;
  89. }
  90. int main(){
  91. int m,n,op,x,y,p;
  92. while(scanf("%d%d",&n,&m)&&(m+n)){
  93. built(,,n);
  94. while(m--){
  95. scanf("%d%d%d%d",&op,&x,&y,&p);
  96. if(op==) update(,x,y,,p);
  97. else if(op==) update(,x,y,p,);
  98. else if(op==) update(,x,y,,p);
  99. else printf("%d\n",query(,x,y,p)%M);
  100. }
  101. }
  102. return ;
  103. }

hdu 4578 Transformation 线段树的更多相关文章

  1. HDU 4578 Transformation --线段树,好题

    题意: 给一个序列,初始全为0,然后有4种操作: 1. 给区间[L,R]所有值+c 2.给区间[L,R]所有值乘c 3.设置区间[L,R]所有值为c 4.查询[L,R]的p次方和(1<=p< ...

  2. hdu 4578 Transformation 线段树多种操作裸题

    自己写了一个带结构体的WA了7.8次 但是测了几组小数据都对..感觉问题应该出在模运算那里.写完这波题解去对拍一下. 以后线段树绝不写struct!一般的struct都带上l,r 但是一条线段的长度确 ...

  3. Transformation HDU - 4578(线段树——懒惰标记的妙用)

    Yuanfang is puzzled with the question below: There are n integers, a 1, a 2, …, a n. The initial val ...

  4. hdu 4031 attack 线段树区间更新

    Attack Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others)Total Subm ...

  5. hdu 4288 离线线段树+间隔求和

    Coder Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su ...

  6. hdu 3016 dp+线段树

    Man Down Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

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

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

  8. HDU 4578 Transformation (线段树)

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

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

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

随机推荐

  1. 分支优化:neg+sbb算术运算代替逻辑跳转

    今天在分析一个样本的时候,发现一段代码. // .text:100012DF sub esi, 0B7h // 183 // .text:100012E5 neg esi // .text:10001 ...

  2. js设计模式(5)---外观模式

    0.前言 早上好,今天天气不错,估计有35度吧,坐在空调室里相当惬意,那么酒足饭饱之后就应该干些正事了. 1. 为什么使用外观模式 外观模式提供了一个高层接口,封装一些复杂操作或繁琐行为,方便调用.门 ...

  3. node.js和socket.io纯js实现的即时通讯实例分享

    在这个例子中,其实node.js并没有真正起到服务器的作用,因为我们这里可以直接运行client.html文件,而不用输入url请求,当 然,要想输入url请求页面内容还需要加入请求静态文件的代码.这 ...

  4. UDP HelloWord

    Client.cpp #include <stdio.h> #include <winsock2.h> #pragma comment (lib,"ws2_32&qu ...

  5. 有趣的checkbox动画切换状态(支付宝转账成功显示)--第三方开源--AnimCheckBox

    这个很有趣的指标通过AnimCheckBox实现,下载地址:https://github.com/lguipeng/AnimCheckBox 代码: activity_main.xml: <Re ...

  6. linux安装IPython四种方法

    IPython是Python的交互式Shell,提供了代码自动补完,自动缩进,高亮显示,执行Shell命令等非常有用的特性.特别是它的代码补完功能,例如:在输入zlib.之后按下Tab键,IPytho ...

  7. apache+tomcat整合

    一 .Apache与Tomcat的比较 apache支持静态页面,tomcat支持动态的,比如servlet等. 一般使用apache+tomcat的话,apache只是作为一个转发,对jsp的处理是 ...

  8. jquery 在ie10中post数据,最终数据丢失的BUG修复

    最近在做项目的时候,发现ie10或者360之类套壳的浏览器(ie10) 在jquery调用post数据的时候,真实的请求并没有上传数据,原因不表,请见 http://stackoverflow.com ...

  9. Microsoft Azure 全球状态

    除了mooncake的中国大陆区域 Azure status http://azure.microsoft.com/en-us/status/?rnd=1#current http://azure.m ...

  10. 4-2.矩阵乘法的Strassen算法详解

    题目描述 请编程实现矩阵乘法,并考虑当矩阵规模较大时的优化方法. 思路分析 根据wikipedia上的介绍:两个矩阵的乘法仅当第一个矩阵B的列数和另一个矩阵A的行数相等时才能定义.如A是m×n矩阵和B ...