树状数组 && 线段树
2017-03-29 19:19
429 查看
树状数组
支持单点修改
#include <cstdio> #include <cstring> #include <iostream> using namespace std; #define root 1, 1, N #define ls o << 1, l, m #define rs o << 1 | 1, m + 1, r int L, R; long long add[1500005], mul[1500005], c[1500005], P; inline int read() { int x = 0, f = 1; char ch = getchar(); while(!isdigit(ch)) { if(ch == '-') f = -1; ch = getchar(); } while(isdigit(ch)) { x = x * 10 + ch - '0'; ch = getchar(); } return x * f; } inline void pushup(int o) { c[o] = (c[o << 1] + c[o << 1 | 1]) % P; } inline void build(int o, int l, int r) { add[o] = 0; mul[o] = 1; if(l == r) { scanf("%lld", &c[o]); return; } int m = (l + r) >> 1; build(ls); build(rs); pushup(o); } inline void pushdown(int o, int m) { if(add[o] == 0 && mul[o] == 1) return; c[o << 1] = (c[o << 1] * mul[o] + add[o] * (m - (m >> 1))) % P; c[o << 1 | 1] = (c[o << 1 | 1] * mul[o] + add[o] * (m >> 1)) % P; add[o << 1] = (add[o << 1] * mul[o] + add[o]) % P; add[o << 1 | 1] = (add[o << 1 | 1] * mul[o] + add[o]) % P; mul[o << 1] = (mul[o << 1] * mul[o]) % P; mul[o << 1 | 1] = (mul[o << 1 | 1] * mul[o]) % P; add[o] = 0; mul[o] = 1; } inline void update(int f, int d, int o, int l, int r) { if(L <= l && r <= R) { if(f == 2) { add[o] = (add[o] + d) % P; c[o] = (c[o] + d * (r - l + 1)) % P; } else { mul[o] = (mul[o] * d) % P; add[o] = (add[o] * d) % P; c[o] = (c[o] * d) % P; } return; } pushdown(o, r - l + 1); int m = (l + r) >> 1; if(L <= m) update(f, d, ls); if(m < R) update(f, d, rs); pushup(o); } inline long long query(int o, int l, int r) { if(L <= l && r <= R) return c[o]; pushdown(o, r - l + 1); int m = (l + r) >> 1; long long ret = 0; if(L <= m) ret += query(ls); if(m < R) ret += query(rs); return ret; } int main() { int N, Q; N = read(); P = read(); build(root); Q = read(); while(Q--) { int a, x, y, k; a = read(); if(a == 1 || a == 2) { x = read(); y = read(); k = read(); L = x; R = y; update(a, k, root); } else { x = read(); y = read(); L = x; R = y; printf("%lld\n", query(root) % P); } } return 0; }View Code
ps:有意思的是这个代码还是[AHOI2009]维护序列的题解
相关文章推荐
- HDU Problem 1166 敌兵布阵 【树状数组 & 线段树】
- 【BZOJ 1901】Zju2112 Dynamic Rankings &&【COGS 257】动态排名系统 树状数组套线段树
- hdu 1166 树状数组 & 线段树
- HDU 1556 前缀和 & 树状数组 & 线段树
- HDOJ 1556 Color the ball(树状数组 & 线段树)
- CSU - 1551 Longest Increasing Subsequence Again —— 线段树/树状数组 + 前缀和&后缀和
- URAL - 1989 Subpalindromes hash & 树状数组 | 线段树
- HDU 1394 (树状数组 & 线段树 两种做法)
- hdu1166 敌兵布阵(树状数组 && 线段树单点更新)
- uva11990 - ``Dynamic'' Inversion(线段树套树状数组+分块)
- HDOJ 1166 敌兵布阵 (树状数组 & 线段树)
- 线段树(询问、插入)&树状数组POJ2352Starts解题报告
- HDU1556:Color the ball(线段树区间更新单点求值)&&树状数组解法
- hdoj Stars 1541 (树状数组模板&&线段树)
- POJ-2155-Matrix(二维树状数组 & 二维线段树)
- hdu 1166 敌兵布阵【入门线段树 & 树状数组】
- CF 12D BALL 线段树 && 树状数组
- 【POJ】2299 - Ultra-QuickSort(离散化 & (树状数组 | 线段树))
- HDU 1166 敌兵布阵 (线段树基础&树状数组基础)
- POJ 3468(树状数组 && 线段树)