以前似乎做过类似的不过当时完全不会。现在看到就有点思路了,开始还有洋洋得意得觉得自己有不小的进步了,结果思路错了。。。改了很久后测试数据过了还果断爆空间。。。

  给你一串数字A,然后是两种操作:

"1 l r k c":意思是当 l=<i<=r 对(i-a)%k = =0 的每个 Ai 都增加 c (1=<k<=10)

"2 i" :意思是求出 Ai

   一看就是区间更新和单点查询,其实可以用树状数组做,可是觉得线段树好弄一点,结果成功入坑。。。

  我们可以发现k特别的小,而对于每一位的k,都有k个不同的余数,所以可以从这儿入手。可以看出对于每一个k,难点在于区间更新的时候并不是一定严格+1的连续区间,但是一定是+k连续区间,所以:

k=1,建一棵从1开始每次+1的树

k=2,建一棵从1开始每次+2的树 建一颗从2开始每次+2的树

k=3,建一棵从1开始每次+3的树 建一颗从2开始每次+3的树 建一棵从3开始每次+3的树

......

建立55棵线段树

  但是如果就直接建立55颗线段树,再建55个对应的更新树,则会爆空间。不过我们可以看是单点查询,根本不需要用父节点记录孩子节点的和,建立线段树仅仅是为了区间更新。所以就可以直接模拟更新树,每个节点记录是此区间每个位置需要增加的值,求值的时候下更新到叶子节点就可以了。注意因为输入的l不是一定对应每棵树的l位置(不是每次都+1),所以我们要处理l,还有就是[l,r]之间我们仅仅更新一些点,右端点要处理好。最后查询的时候要查询10棵树

  本以为对线段树有些心得了,可是对于有一点变化的东西都不能灵活运用,还需努力了

  1. #include<set>
  2. #include<map>
  3. #include<queue>
  4. #include<stack>
  5. #include<cmath>
  6. #include<vector>
  7. #include<string>
  8. #include<cstdio>
  9. #include<cstring>
  10. #include<stdlib.h>
  11. #include<iostream>
  12. #include<algorithm>
  13. using namespace std;
  14. #define eps 1E-8
  15. /*注意可能会有输出-0.000*/
  16. #define Sgn(x) (x<-eps? -1 :x<eps? 0:1)//x为两个浮点数差的比较,注意返回整型
  17. #define Cvs(x) (x > 0.0 ? x+eps : x-eps)//浮点数转化
  18. #define zero(x) (((x)>0?(x):-(x))<eps)//判断是否等于0
  19. #define mul(a,b) (a<<b)
  20. #define dir(a,b) (a>>b)
  21. typedef long long ll;
  22. typedef unsigned long long ull;
  23. const int Inf=<<;
  24. const double Pi=acos(-1.0);
  25. const int Max=<<;
  26. int segtr[Max][];//建立55棵线段树 因为是单点查询,所以每次查询到孩子节点,父节点就只需要记录孩子增加了多少,所以线段树节点就模拟更新的树就好
  27. int per[Max],pos[][];//记录初始值 记录节点在树的位置
  28. void Create(int sta,int enn,int now)
  29. {
  30. memset(segtr[now],,sizeof(segtr[now]));
  31. if(sta==enn)
  32. {
  33. scanf("%d",&per[sta]);
  34. return;
  35. }
  36. int mid=dir(sta+enn,);
  37. int next=mul(now,);
  38. Create(sta,mid,next);
  39. Create(mid+,enn,next|);
  40. return;
  41. }
  42. void Downow(int now,int next,int k)//区间更新的关键
  43. {
  44. if(segtr[now][k])//相当于区间更新
  45. {
  46. segtr[next][k]+=segtr[now][k];
  47. segtr[next|][k]+=segtr[now][k];
  48. segtr[now][k]=;
  49. }
  50. return;
  51. }
  52. void Update(int sta,int enn,int now,int x,int y,int k,int add)
  53. {
  54. if(sta>=x&&enn<=y)
  55. {
  56. segtr[now][k]+=add;
  57. return;
  58. }
  59. int mid=dir(sta+enn,);
  60. int next=mul(now,);
  61. Downow(now,next,k);//只需要下更新
  62. if(mid>=x)
  63. Update(sta,mid,next,x,y,k,add);
  64. if(mid<y)
  65. Update(mid+,enn,next|,x,y,k,add);
  66. return;
  67. }
  68. int Query(int sta,int enn,int now,int x,int k)
  69. {
  70. if(sta==enn)
  71. {
  72. return segtr[now][k];
  73. }
  74. int mid=dir(sta+enn,);
  75. int next=mul(now,);
  76. Downow(now,next,k);//只需要下更新
  77. if(mid>=x)
  78. return Query(sta,mid,next,x,k);
  79. else
  80. return Query(mid+,enn,next|,x,k);
  81. }
  82. int main()
  83. {
  84. int n,q,coun=;
  85. for(int i=;i<;i++)
  86. for(int j=;j<=i;j++)
  87. pos[i][j]=coun++;
  88. while(~scanf("%d",&n))
  89. {
  90. Create(,n,);
  91. scanf("%d",&q);
  92. int typ,lef,rig,k;
  93. int add;
  94. while(q--)
  95. {
  96. scanf("%d",&typ);
  97. if(typ==)
  98. {
  99. add=;
  100. scanf("%d",&lef);
  101. for(int i=; i<; i++)//查询时需要查询10棵树
  102. add+=Query(,n,,(lef+i)/(i+),pos[i][(lef-)%(i+)]);//相同大小在每棵树的位置不一样,注意
  103. add+=per[lef];
  104. printf("%d\n",add);
  105. }
  106. else
  107. {
  108. scanf("%d %d %d %d",&lef,&rig,&k,&add);//只是更新一棵树就好
  109. Update(,n,,(lef+k-)/k,(rig-lef)/k+(lef+k-)/k,pos[k-][(lef-)%k],add);//注意更新的只是输入的左右区间内的一部分
  110. }
  111. }
  112. }
  113. return ;
  114. }

HDU 4267 A Simple Problem with Integers(2012年长春网络赛A 多颗线段树+单点查询)的更多相关文章

  1. HDU 4267 A Simple Problem with Integers

    A Simple Problem with Integers Time Limit: 5000/1500 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  2. HDU 4267 A Simple Problem with Integers(树状数组区间更新)

    A Simple Problem with Integers Time Limit: 5000/1500 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  3. 【树状数组区间修改单点查询+分组】HDU 4267 A Simple Problem with Integers

    http://acm.hdu.edu.cn/showproblem.php?pid=4267 [思路] 树状数组的区间修改:在区间[a, b]内更新+x就在a的位置+x. 然后在b+1的位置-x 树状 ...

  4. HDU 4267 A Simple Problem with Integers --树状数组

    题意:给一个序列,操作1:给区间[a,b]中(i-a)%k==0的位置 i 的值都加上val  操作2:查询 i 位置的值 解法:树状数组记录更新值. 由 (i-a)%k == 0 得知 i%k == ...

  5. 2012年长春网络赛(hdu命题)

    为迎接9月14号hdu命题的长春网络赛 ACM弱校的弱菜,苦逼的在机房(感谢有你)呻吟几声: 1.对于本次网络赛,本校一共6名正式队员,训练靠的是完全的自主学习意识 2.对于网络赛的群殴模式,想竞争现 ...

  6. HDOJ 4267 A Simple Problem with Integers (线段树)

    题目: Problem Description Let A1, A2, ... , AN be N elements. You need to deal with two kinds of opera ...

  7. HDU 4747 Mex (2013杭州网络赛1010题,线段树)

    Mex Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submis ...

  8. HDU 3974 Assign the task(DFS序+线段树单点查询,区间修改)

    描述There is a company that has N employees(numbered from 1 to N),every employee in the company has a ...

  9. 【HDOJ】4267 A Simple Problem with Integers

    树状数组.Easy. /* 4267 */ #include <iostream> #include <string> #include <map> #includ ...

随机推荐

  1. asp.net repeater Container.ItemIndex

    <asp:Repeater ID="myRepeater" runat="server"> <HeaderTemplate> <t ...

  2. 好员工去哪儿了:高端IT白领荒胜过春节保姆荒

    来自:http://tech.163.com/14/0312/07/9N4BLV8S000915BD.html 于是,你看到的就是这样一幕悖论:一群手握大把工作机会的雇主,在面对一群眼巴巴等待工作机会 ...

  3. linux网络及防火墙配置命令

      /etc/sysconfig/network 包括主机基本网络信息,用于系统启动 /etc/sysconfig/network-script/ 此目录下是系统启动最初始化网络的信息 /etc/sy ...

  4. 关于ViewData,ViewBag,TempData三者学习记录!

    关于ViewData,ViewBag,TempData三者学习分享! 1.ViewData和TempData是字典类型,赋值方式用字典方式,ViewData["Key"] . 2. ...

  5. Mysql----mysql启动服务时提示"服务名无效"

    1,首先说明一下我的环境,我刚开始是用的XAMPP这个集成的软件,里面安装了apache, mysql,tomcat这些软件,然后通过控制面板对其进行启动关闭的操作,这些操作很方便,但是我就用net ...

  6. 常用PHP array数组函数

    array_rand  第二个参数用来确定要选出几个元素 如果选出的元素不止一个,则返回包含随机键名的数组,否则返回该元素的键名. $a=array("red","gre ...

  7. jquery 使用笔记

    一下是在做项目中用到jquery涉及到的一些知识点,把源码复制过来,省得以后忘记了: <link href="<%=request.getContextPath()%>/c ...

  8. 关于KMP算法的感想

    今天,看了KMP,首先是在网上看的,看了很久没看懂,有很多思想,很多next的推导,就相当于很多的版本,后来,去看了<<大话数据结构>>这本书,才看懂,这KMP的神奇之处,这本 ...

  9. Eureka集群搭建

    服务注册.发现是微服务架构的关键原理之一,由于微服务架构是由一系列职责单一的细粒度服务构成的网状结构,服务之间通过轻量机制进行通信,这就必然引入一个服务注册发现的问题,也就是说服务提供方要注册报告服务 ...

  10. 在安装mysql数据库的过程中,显示msvcp100.dll丢失?则么办?

    方案一:重装操作系统为windows10专业版 方案二:问题: 解答: 报错原因是VC运行库不全或者没有安装导致,百度搜索VC集合下载安装, 链接:https://pan.baidu.com/s/1U ...