这道题真的是好题,让我对线段树有了全新的认识,至少让我真正感受到了线段树的神奇。

题意是就是线段树区间更新,单点询问的问题,不过这个题好就好在它的区间更新的点并不连续!

adding c to each of Ai which satisfies a <= i <= b and (i - a) % k == 0.

关键在于更新的点所满足的条件  1.在区间[a,b]中。 2.关于k的余数与(a%k)相等。

其中第二个条件保证了更新的点不连续(但如果传统的先判断再更新,则线段树失去了优势,因为始终会超时)。

本题突破口在于K的大小(1 <= k <= 10),结合第二个条件,我们可以想到在线段树的 Lazy标记上做文章。

当k==1 余数有 0

当k==2 余数有 0,1

当k==3 余数有 0,1,2

。。。。。

可以看到,只有55种情况,那么我们只需要将线段树的 Lazy标记 扩充为大小55的数组,

然后根据相应的余数情况进行更新与查询即可。

  1. #include<iostream>
  2. #include<sstream>
  3. #include<stack>
  4. #include<cstdio>
  5. #include<cstdlib>
  6. #include<cstring>
  7. #include<climits>
  8. #include<cctype>
  9. #include<queue>
  10. #include<algorithm>
  11. #include<cmath>
  12. #include<map>
  13. #include<set>
  14. #define lson root<<1,l,mid
  15. #define rson root<<1|1,mid+1,r
  16.  
  17. #define inf 0x3f3f3f3f
  18. #define N 50010
  19. #define maxn 10001000
  20. #define mod 1000000007
  21. using namespace std;
  22.  
  23. int a[N];
  24. int b[][]; //用于将55种余数情况一 一 对 应
  25. struct NODE{
  26. int l,r;
  27. int v;
  28. int b[];
  29. int mid(){
  30. return (l+r)>>;
  31. }
  32. }node[N<<];
  33.  
  34. void build(int root,int l,int r)
  35. {
  36. node[root].l=l;
  37. node[root].r=r;
  38. node[root].v=;
  39. memset(node[root].b,,sizeof(node[root].b));
  40. if(l==r) return;
  41. int mid=node[root].mid();
  42. build(lson);
  43. build(rson);
  44. }
  45.  
  46. void pushdown(int root) //关于pushdown函数,个人觉得只需要询问时调用就行了,而且也过了,应该没问题,有的话请指出,谢谢
  47. {
  48. for(int i=; i<=; ++i)
  49. {
  50. for(int j=; j<i; ++j)
  51. {
  52. node[root<<].b[b[i][j]]+=node[root].b[b[i][j]];
  53. node[root<<|].b[b[i][j]]+=node[root].b[b[i][j]];
  54. }
  55. }
  56. memset(node[root].b,,sizeof(node[root].b));
  57. }
  58.  
  59. void update(int x,int y,int root,int v,int k,int rd)
  60. {
  61. if(node[root].l==x&&node[root].r==y)
  62. {
  63. node[root].b[b[k][rd]]+=v;
  64. node[root].v+=v;
  65. return;
  66. }
  67. int mid=node[root].mid();
  68. if(y<=mid) update(x,y,root<<,v,k,rd);
  69. else if(x>mid) update(x,y,root<<|,v,k,rd);
  70. else
  71. {
  72. update(x,mid,root<<,v,k,rd);
  73. update(mid+,y,root<<|,v,k,rd);
  74. }
  75. }
  76.  
  77. int query(int root,int x)
  78. {
  79. if(node[root].l==x&&node[root].r==x)
  80. {
  81. int ans=;
  82. for(int i=; i<=; ++i)
  83. ans+=node[root].b[b[i][x%i]];
  84. return ans;
  85. }
  86. pushdown(root);
  87. int mid=node[root].mid();
  88. if(x<=mid) return query(root<<,x);
  89. else return query(root<<|,x);
  90. }
  91.  
  92. int main()
  93. {
  94. // freopen("lxx.txt","r",stdin);
  95. int group,figure,i,j,x,y,k,v,num;
  96. int cnt=;
  97. for(i=; i<=; ++i)
  98. for(j=; j<i; ++j)
  99. b[i][j]=cnt++;
  100. while(~scanf("%d",&group))
  101. {
  102. build(,,group);
  103. memset(a,,sizeof(a));
  104. for(i=; i<=group; ++i) scanf("%d",&a[i]);
  105. scanf("%d",&group);
  106. while(group--)
  107. {
  108. scanf("%d",&num);
  109. if(num==)
  110. {
  111. scanf("%d%d%d%d",&x,&y,&k,&v);
  112. update(x,y,,v,k,x%k);
  113. }
  114. else
  115. {
  116. scanf("%d",&figure);
  117. printf("%d\n",query(,figure)+a[figure]);
  118. }
  119. }
  120. }
  121. return ;
  122. }

不过感觉自己的代码风格还不够成熟,继续努力!

HDU4267(2012年长春站)的更多相关文章

  1. Windows server 2012 添加中文语言包(英文转为中文)(离线)

    Windows server 2012 添加中文语言包(英文转为中文)(离线) 相关资料: 公司环境:亚马孙aws虚拟机 英文版Windows2012 中文SQL Server2012安装包,需要安装 ...

  2. Windows Server 2012 NIC Teaming介绍及注意事项

    Windows Server 2012 NIC Teaming介绍及注意事项 转载自:http://www.it165.net/os/html/201303/4799.html Windows Ser ...

  3. 1.初始Windows Server 2012 R2 Hyper-V + 系统安装详细

    干啥的?现在企业服务器都是分开的,比如图片服务器,数据库服务器,redis服务器等等,或多或少一个网站都会用到多个服务器,而服务器的成本很高,要是动不动采购几十台,公司绝对吃不消的,于是虚拟化技术出来 ...

  4. 0.Win8.1,Win10,Windows Server 2012 安装 Net Framework 3.5

    后期会在博客首发更新:http://dnt.dkill.net 网站部署之~Windows Server | 本地部署:http://www.cnblogs.com/dunitian/p/482280 ...

  5. windows 2012 r2 can't find kb2919355

    问题   解决: 1.手动安装了 Windows8.1-KB2919442-x64 2.手动下载 KB2919355 更新成功     Turns out to have been a result ...

  6. Windows Server 2012 磁盘管理之 简单卷、跨区卷、带区卷、镜像卷和RAID-5卷

    今天给客户配置故障转移群集,在Windows Server 2012 R2的系统上,通过iSCSI连接上DELL的SAN存储后,在磁盘管理里面发现可以新建 简单卷.跨区卷.带区卷.镜像卷.RAID-5 ...

  7. VMware下Windows Server 2012添加新磁盘

    系统管理员在VM下新装了一台Windows Server 2012服务器,我在上面安装了SQL Server 2014 Standard版数据库,安装之初,只分配了一个C盘,我想在这台服务器上添加了三 ...

  8. 在Windows Server 2012中如何快速开关桌面上经典的“计算机、我的文档”等通用图标

    我们都知道,在Windows Server 2012系列的服务器版本中都已经引入了Modern的现代界面作为默认的用户交互界面,同时满足视觉一致化,新版的服务器管理程序也做成了扁平化.因此传统的计算机 ...

  9. VmWare平台Windows Server 2012 无响应宕机

    我们生产服务器都部署在VMware ESXi 5.5平台上,最近大半年的时间,偶尔就会出现操作系统为Windows Servre 2012的服务器出现没有任何响应(unresponsive)的情况,出 ...

随机推荐

  1. SuperMap iClient如何使用WMTS地图服务

    SuperMap iClient如何使用WMTS地图服务 什么是WMTS服务 WMTS,切片地图Web服务(Web Map Tile Service)当前版本是1.0.0.该服务符合 OGC(Open ...

  2. 【服务器时间修改为东八区】包括Apache2和mysql

    1.服务器Apache时间修改,可通过修改php.ini进行修改 所以就深入了解了一下, 发现Apache(PHP)的服务器时间时区默认为UTC(Coordinated UniversalTime 世 ...

  3. Task WaitAll的用法

    var tasklst = new List<Task>(); ; i < urls.Count; i++) { tasklst.Add(Task.Factory.StartNew& ...

  4. 判断Server Manager里面的Role是否已经安排

    用InstallState来判断 function Check-DataDeduplication{ Import-Module "ServerManager" -ErrorAct ...

  5. php serialize序列化对象或者数组

    serialize序列化对象或者数组 $str=serialize(array('a'=>1,'b'=>2)); echo $str; 输入出a:2:{s:1:"a"; ...

  6. mysql 添加缓存

    解决方法一,修改my.ini文件 找到 query_cache_size  =0 估计就是这个问题在造成的,没有开查询缓存 (一般1G 就64M缓存) 我的服务器的内存4G, 调整到  代码如下 复制 ...

  7. shared-service.ts

    shared-service.ts import { Observable } from 'rxjs/Observable'; import { Injectable } from '@angular ...

  8. WebView中input file的解决方法

    public class MyWb extends Activity { /** Called when the activity is first created. */ WebView web; ...

  9. HDU 1358 Period(kmp简单解决)

    Period Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  10. ERROR C2676

    直接上代码: nl.h #ifndef NL_H #define NL_H #include <iosfwd> namespace ZJ { /** Insert a newline ch ...