题意:
     给你N个数,q组操作,操作有两种,查询和改变,查询就是查询当前的这个数上有多少,更改是给你a b k c,每次从a到b,每隔k的数更改一次,之间的数不更改,就相当于跳着更新.

思路:(别人的)

(i - a) % k == 0 等价于 i % k == a % k 一共有10中情况
  还有枚举所有情况中的小情况
   (1)1 2 3 4 5 6 7 8 9.....
   (2)1 3 5 7 9 11 13 ......
      2 4 6 8 10 12 14......
   (3)1 4 7 10 13...
      2 5 8 11 14...
      3 6 9 12 15...
      一共1 + 2 +....+ 10 = 55种
    其实每一个数字必然在这55种情况中的10种,对于每次更新就是更新这个数组在这55种情况中的1种,而查询就是查询这个数字的10种情况的和,数组num[t][key],t是线段树上的点,key是这55中情况中的一种,对于每一个点a ,key = a % k + k * (k - 1) / 2 ,这样相当于我们直接建了55棵树,对于每个区间更新的时候,我们直接可以用线段树的短更新,

比如1--5,k = 2,我们直接找到 key = 1 % 2 + 2 * (2 - 1) / 2 = 2,则可以确定的是在第二课树上,我们把所有1--5的在第二棵树上的都更新看下上面发现第2课树上没有2,4我们也更新了num[2][2] ,num[4][2],虽然更新了,但在查找的时候永远不可能查找的到的,同时它把操作变成了连续的,这样就可以用线段树的 段更新点查找模板AC了...


#include<stdio.h>
#include<string.h>#define lson l,mid,t<<1
#define rson mid+1,r,t<<1|1

int num[150000][55];
int aa[50000];void update(int l ,int r ,int t , int a ,int b ,int c ,int key)
{if(a <= l && r <= b){num[t][key] += c;return ;}int mid = (l + r) >> 1;if(a <= mid)update(lson ,a ,b ,c ,key);if(b > mid)update(rson ,a ,b ,c ,key);return;
}int query(int l ,int r ,int t ,int a)
{int ans = 0;for(int i = 1 ;i <= 10 ;i ++)ans += num[t][a % i + i * (i-1) / 2];if(l == r)return ans;int mid = (l + r) >> 1;if(a <= mid)ans += query(lson ,a);elseans += query(rson ,a);return ans;
}int main ()
{int n ,q ,qq ,a ,b ,c ,k;while(~scanf("%d" ,&n)){for(int i = 1 ;i <= n ;i ++)scanf("%d" ,&aa[i]);memset(num ,0 ,sizeof(num));scanf("%d" ,&qq);while(qq--){scanf("%d" ,&q);if(q == 1){scanf("%d %d %d %d" ,&a ,&b ,&k ,&c);update(1 ,n ,1 ,a ,b ,c ,a % k + k * (k - 1) / 2);}else{scanf("%d" ,&a);printf("%d\n" ,aa[a] + query(1 ,n ,1 ,a));}}}return 0;
}

hdu4267线段树段更新,点查找,55棵线段树.相关推荐

  1. UVA11992不错的线段树段更新

    题意:       给你一个矩阵,最大20*50000的,然后有三个操作 1 x1 y1 x2 y2 v  把子矩阵的值全部都加上v 2 x1 y1 x2 y2 v  把子矩阵的值全部都变成v 2 x ...

  2. hdu1556 线段树段更新(简单题)

    题意: N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的"小飞鸽"牌电动车从气球a开始到气球b依次给每个 ...

  3. POJ2528线段树段更新逆序异或(广告牌)

    题意:      可以这样理解,有一条直线,然后用n条线段去覆盖,最后问全部都覆盖完之后还有多少是没有被完全覆盖的. 思路:      一开始想的有点偏,想到起点排序,然后..失败了,原因是忘记了题目 ...

  4. POJ3277 线段树段更新,点询问+二分离散化+暴力

    题意:       x轴上有一些矩形,问你这些矩形覆盖的面积和是多少. 思路:       首先范围很大,n很小,果断离散化,然后我们就是求出任意区间的最大值作为当前区间的高,最后在算一遍答案就行了, ...

  5. POJ 2528 Mayor's posters 贴海报 线段树 区间更新

    注意离散化!!!线段树的叶子结点代表的是一段!!! 给出下面两个简单的例子应该能体现普通离散化的缺陷: 1-10 1-4 5-10 1-10 1-4 6-10 普通离散化算出来的结果都会是2,但是第二 ...

  6. 面试题:mysql 一棵 B+ 树能存多少条数据?

    大家好,我是Tom哥~ 今日寄语:充满活力的新人,能让身边的人都重回初心,真是不可思议. mysql 的InnoDB存储引擎 一棵B+树可以存放多少行数据? (答案在文章中!!) 要搞清楚这个问题,首 ...

  7. uscao 线段树成段更新操作及Lazy思想(POJ3468解题报告)

    线段树成段更新操作及Lazy思想(POJ3468解题报告) 标签: treequerybuildn2cstruct 2011-11-03 20:37 5756人阅读 评论(0) 收藏 举报  分类: ...

  8. NYOJ 1068 ST(线段树之 成段更新+区间求和)

    ST 时间限制:1000 ms  |  内存限制:65535 KB 难度:1 描述 "麻雀"lengdan用随机数生成了后台数据,但是笨笨的他被妹纸的问题给难住了... 已知len ...

  9. HDOJ 1698 Just a Hook(线段树成段更新)

    题意: 屠夫的钩子区间是1~n,每段可能由铜,银,金组成,价值分别为1,2,3,进行一系列的更新之后,求钩子的总价值. 思路: 线段树的成段更新:要设置一个临时的线段树,每次更新的时候把更新段的值放在 ...

最新文章

  1. C 语言面试题 — int i [ 4 ]={ i [ 2 ]=2 }
  2. Facebook如何向十亿人推荐东西
  3. 计算机组装维护的概念,实用计算机组装与维护库及概念.doc
  4. docker修改默认存储位置
  5. BizTalk开发系列(九) MAP的连接方法
  6. Protocol Buffers的应用
  7. 申万一级行业日指数_基金收评 | 指数震荡走弱,军工股成两市主线!后期行情如何?...
  8. idea无法正常使用SVN的解决方法
  9. suitecrm查询功能去掉统配符%
  10. CS academy Binary Flips(dp)
  11. c语言中的面积和体积计算器,C语言编程问题(面积计算器)——新手问题
  12. hexo博客next主题6.0版本个性化设置
  13. 详解C++学习方向和就业方向!
  14. office2016、office365和office其它版本JH
  15. 3dmark压力测试 linux,拷机还用Furmark? 瞧瞧3DMark压力测试怎样玩
  16. 修改mysql字段为主键且自增
  17. 用命令行编译java文件
  18. 卷毛0基础学习Golang-并发编程-03 channel管道
  19. 文件批量下载工具(自己用QT编写)
  20. FPGA学习日志——一位全加器full_adder

热门文章

  1. No identifier specified for entity
  2. git基础: 《获取Git仓库》学习笔记
  3. 表单的增 删 改 查
  4. C#中抽象类和接口的区别与使用
  5. 移动端geolocation插件+百度地图js获取地址
  6. BZOJ 2788[Poi2012]Festival
  7. [改善Java代码]适时选择不同的线程池来实现
  8. 第二百二十六天 how can I 坚持
  9. C#读取Excel显示到repeater中
  10. 0050算法笔记——【线性规划】单纯形算法(未完全实现)