hdu 4267 A Simple Problem with Integers 树状数组
2016-02-27 20:13
363 查看
题目
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4267题目来源:2016.2.26群赛
简要题意:询问某数为多少,对[l,r][l,r]内i−l≡0modki-l\equiv 0 \mod k的aia_i加上cc。
题解
一开始以为是个线段树区间更新,不过后来想想整个信息没法叠加,不能这么做。维护5555个树状数组,bt[mod][rem]bt[mod][rem]表示模modmod为remrem的情况。
写的时候可以编码节约空间,更新树状数组的时候要避免下标00,要注意下标增加是可能超过nn的。
数据结构功力还是太差了。
代码
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <cstring> #include <stack> #include <queue> #include <string> #include <vector> #include <set> #include <map> #define fi first #define se second using namespace std; typedef long long LL; typedef pair<int,int> PII; // head const int N = 5e4+5; struct BIT { #define T int T tree ; inline int lowbit(int x) { return x&(-x); } void add(int x, T add, int n) { for (int i = x; i <= n; i += lowbit(i)) { tree[i] += add; } } T sum(int x) { T ans = 0; for (int i = x; i > 0; i -= lowbit(i)) { ans += tree[i]; } return ans; } void clear(int n) { for (int i = 1; i <= n; i++) { tree[i] = 0; } } #undef T }; struct DataStructure { BIT bt[56]; int getBITIndex(int rem, int mod) { return (mod - 1) * mod / 2 + rem; } int getPos(int x, int rem, int mod) { return (x - rem) / mod + 1; } void modify(int l, int r, int mod, int v, int n) { int rem = l % mod; int x = getBITIndex(rem, mod); int lb = getPos(l, rem, mod); int ub = getPos(r, rem, mod); bt[x].add(lb, v, n+5); bt[x].add(ub+1, -v, n+5); } int query(int x) { int ans = 0; for (int mod = 1; mod <= 10; mod++) { int rem = x % mod; int pos = getBITIndex(rem, mod); int mpos = getPos(x, rem, mod); ans += bt[pos].sum(mpos); } return ans; } void clear(int n) { for (int i = 0; i < 56; i++) { bt[i].clear(n); } } }; DataStructure d; int a ; int main() { int n, m, l, r, mod, v, op; while (scanf("%d", &n) == 1) { for (int i = 1; i <= n; i++) { scanf("%d", a+i); } scanf("%d", &m); while (m--) { scanf("%d", &op); if (op == 1) { scanf("%d%d%d%d", &l, &r, &mod, &v); d.modify(l, r, mod, v, n); } else { scanf("%d", &v); printf("%d\n", a[v] + d.query(v)); } } d.clear(n+5); } return 0; }
相关文章推荐
- Android应用的自动升级、更新模块的实现
- 往SQLiteDatabase利用API或普通SQL语句增删改查数据详解
- bzoj2287【POJ Challenge】消失之物
- 实现卡片翻转的动画效果
- LeetCode题解:Reverse Linked List
- bzoj1710【Usaco2007 Open】Cheappal 廉价回文
- Ubuntu 14.04 部署 CEPH集群
- 解决System进程占用80端口
- 关于Gson的各数据类型转换
- usaco 第一章博客指引
- ubuntu 启动长时间黑屏解决
- Android 完美实现图片圆角和圆形(对实现进行分析)
- 使用多进程会造成的问题
- bzoj2101【Usaco2010 Dec】Treasure Chest 藏宝箱
- HTML5移动开发实战必备知识——本地存储(1)
- eclipse4.5在Linux下标题栏显示过大的调整方法
- bzoj2023【Usaco2005 Nov】Ant Counting 数蚂蚁
- 俄罗斯程序员的编程人生
- 注册表信息(安装包ProductCode,设置启动运行)
- Python教程