方法参考http://blog.csdn.net/acm_cxlove/article/details/7854526

题目:给出n个数,每次将一段区间内满足(i-l)%k==0 (r>=i>=l) 的数ai增加c
http://acm.hdu.edu.cn/showproblem.php?pid=4267
比较容易往线段树上想的。但是由于更新的是一些离散的点,比较麻烦
可以考虑这些点的共性,总是隔几个,更新一个,那我们把区间内的数关于k的余数分组
这样每次更新的都是其中的一组,而且是连续的。
由于 K比较小,这是本题的突破口,那么关于k的余数情况,最多只有55种。
即如果k=1,则分为1组,k=2分为2组……
一开始傻叉了打算维护55棵线段树,其实也是可以的,更新只需要1棵,查询是10棵,还是可以接受的。
不过只需要在线段树结点维护这55种情况即可。
不过内存比较紧,要把所有的情况压缩一下,不能开10*10的空间。
同样更新只需要一个,最终统计的话,需要遍历所有的K,也就是最多是10.

自己太水了,有些技巧的线段树现在还是想不出,知识量太少了

#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
# define MAX 51111
# define ll(x) x << 1
# define rr(x) x << 1 | 1
using namespace std;struct node {int l,r,sum,mid;int add[55]; //关于k的余数情况,最多只有55种
}tree[MAX*4];
int a[MAX],n,cnt[11][11];void build (int l,int r,int num) {tree[num].l = l;tree[num].r = r;tree[num].mid = (l + r) >> 1;memset(tree[num].add,0,sizeof(tree[num].add));tree[num].sum = 0;if(l == r)return ;build(l,tree[num].mid ,ll(num));build(tree[num].mid + 1,r,rr(num));
}void up(int num) {tree[num].sum = tree[ll(num)].sum + tree[rr(num)].sum;
}void down(int num) {if(tree[num].sum != 0) {tree[ll(num)].sum += tree[num].sum;tree[rr(num)].sum += tree[num].sum;tree[num].sum = 0;for(int i=0; i<55; i++) {tree[ll(num)].add[i] += tree[num].add[i];tree[rr(num)].add[i] += tree[num].add[i];tree[num].add[i] = 0;}}
}void update(int l,int r,int num,int mod,int j, int dsum) {if(l <= tree[num].l && r >= tree[num].r) {tree[num].add[cnt[mod][j]] += dsum;tree[num].sum += dsum;return ;}down(num);if(r <= tree[num].mid ) update (l,r,ll(num),mod,j,dsum);else if(l > tree[num].mid) update(l,r,rr(num),mod,j,dsum);else {update(l,tree[num].mid,ll(num),mod,j,dsum);update(tree[num].mid+1,r,rr(num),mod,j,dsum);}up(num);
}int query(int num,int j) {if(tree[num].l == tree[num].r) {int tmp = a[tree[num].l];for(int i=1; i<=10; i++) tmp += tree[num].add[cnt[i][j%i]] ;return tmp;}down(num);if(j <= tree[num].mid) return query(ll(num),j);else return query(rr(num),j);
}int main() {int i,m;int p,q,r,s,t;int tmp = 0;for(i=1; i<=10; i++)for(int j=0; j<i; j++) cnt[i][j] = tmp++;while(cin >> n) {for(i=1; i<=n; i++) {scanf("%d",&a[i]);}build(1,n,1);cin >> m;for(i=1; i<=m; i++) {scanf("%d",&p);if(p == 2) {scanf("%d",&q);printf("%d\n",query(1,q));}else {scanf("%d%d%d%d",&q,&r,&s,&t);update(q,r,1,s,q % s,t);}}}return 0;
}

HDU 4267 A Simple Problem with Integers相关推荐

  1. HDU 4267 A Simple Problem with Integers [树状数组]

    根据%k=a中a和k的不同组合建立55棵树状数组,每次修改操作只对其中1棵树状数组进行操作,每次查询对其中10棵树状数组统计增量和. 1 #include <string.h> 2 #in ...

  2. 【线段树】【模板】讲解 + 例题1 HDU - 1754 I Hate It (点修改分数)+ 例题二 POJ - 3468 A Simple Problem with Integers(区间加值)

    [线段树][模板]讲解 + 例题1 HDU - 1754 I Hate It (点修改分数)+ 例题二 POJ - 3468 A Simple Problem with Integers(区间加值) ...

  3. poj 3243:A Simple Problem with Integers

    3243:A Simple Problem with Integers 查看 提交 统计 提示 提问 总时间限制:  5000ms  单个测试点时间限制:  2000ms  内存限制:  131072 ...

  4. A Simple Problem with Integers

    http://poj.org/problem?id=3468 http://acm.hdu.edu.cn/showproblem.php?pid=4267 C++版本一 /* *@Author: ST ...

  5. poj3468 A Simple Problem with Integers

    http://acm.hust.edu.cn:8080/judge/problem/viewProblem.action?id=14607 题意:题目给你n个数,m个操作,接下来一行给你这n个数,接下 ...

  6. (线段树模板)A Simple Problem with Integers --POJ--3468

    链接: http://poj.org/problem?id=3468 代码: 1 #include<stdio.h> 2 #include<algorithm> 3 #incl ...

  7. POJ3468 A Simple Problem with Integers【线段树 成段更新+求和 lazy标志】

    用longlong替换__int64也成. #define LL long long 输入输出用%lld Problem: 3468   User: qq1203456195 Memory: 4284 ...

  8. poj 3468 A Simple Problem with Integers(线段树区区)

    题目链接:  http://poj.org/problem?id=3468 题目大意:  给出N个数,和M次查询 C a b c  区间[a,b]的值都加上c Q a b     查询区间[a,b]值 ...

  9. A Simple Problem with Integers POJ - 3468(线段树+区间查询+区间修改+建树+懒惰标记模板)+(树状数组)

    题意: 有一个数组,有两种操作.1: Q a b 求[a,b]的和 2:C a b c 给[a,b] 的所有元素都加上c. 题目: You have N integers, A1, A2, ... , ...

最新文章

  1. 自定义View合辑(8)-跳跃的小球(贝塞尔曲线)
  2. 从云端到边缘 AI推动FPGA应用拓展
  3. 免费的新一代私有云平台Nano v0.3.1发布:云主机快照及媒体管理
  4. influxdb入门——和mongodb一样可以动态增加字段
  5. 微软要打造通用Windows平台,但这将是一场苦战
  6. sublime xdebug调试php
  7. 常用打开新页面的方法
  8. TensorFlow 分布式
  9. 电视盒安装php,全志a20安卓电视盒子安装可道云kodexplorer服务-编译安装php7.3+nginx...
  10. windows下获取IP和MAC地址
  11. zTree根据ID选中节点
  12. pytorch 与numpy 部分操作的对应关系
  13. 一张图看懂什么是运维?
  14. 2022程序猿生产力软件推荐
  15. python中如何去掉重复元素
  16. 暴力推导 Beta 函数与 Gamma 函数关系式
  17. js制作网页动态背景
  18. 诺奖得主:2030年中国帕金森疾病患者将超过美国
  19. SPSS Modeler泰坦尼克号幸存者分析
  20. win10自带vc运行库吗?

热门文章

  1. MySQL Workbench 怎么创建数据库
  2. Nginx服务器搭建和基本配置详解
  3. 07:清泉-改(prime+堆)
  4. 事件响应政策制定常见雷区,都踩了我就只能祝福你了……
  5. jQuery的使用及关于框架造型(转)
  6. iphone开发如何测试?
  7. greta的问题及解决: LIBCMTD.lib(_wctype.obj) : error LNK2005: _iswspace already defined in xxx.obj...
  8. python合法标识符int32_在Python中使用0xFFFFFFFF掩码检测int32溢出?
  9. 员工张三有两个主管线程_如何做好中层?想让领导满意、员工信服、自己轻松,这2技能必备...
  10. mybati内sql查询语句在两个日期内