【HDOJ】4348 To the moon
2016-02-13 17:37
453 查看
主席树区间更新,延迟标记。
/* 4348 */ #include <iostream> #include <sstream> #include <string> #include <map> #include <queue> #include <set> #include <stack> #include <vector> #include <deque> #include <algorithm> #include <cstdio> #include <cmath> #include <ctime> #include <cstring> #include <climits> #include <cctype> #include <cassert> #include <functional> #include <iterator> #include <iomanip> using namespace std; //#pragma comment(linker,"/STACK:102400000,1024000") #define sti set<int> #define stpii set<pair<int, int> > #define mpii map<int,int> #define vi vector<int> #define pii pair<int,int> #define vpii vector<pair<int,int> > #define rep(i, a, n) for (int i=a;i<n;++i) #define per(i, a, n) for (int i=n-1;i>=a;--i) #define clr clear #define pb push_back #define mp make_pair #define fir first #define sec second #define all(x) (x).begin(),(x).end() #define SZ(x) ((int)(x).size()) // #define lson l, mid, rt<<1 // #define rson mid+1, r, rt<<1|1 const int maxn = 1e5+5; const int maxm = 5e6+5; int T[maxn]; int lson[maxm], rson[maxm]; __int64 sum[maxm], delta[maxm]; int a[maxn]; int tot, n, q; inline void PushUp(int rt) { sum[rt] = sum[lson[rt]] + sum[rson[rt]]; } void init() { tot = 0; } int Build(int l, int r) { int rt = tot++; delta[rt] = 0; if (l == r) { sum[rt] = a[l]; return rt; } int mid = (l + r) >> 1; lson[rt] = Build(l, mid); rson[rt] = Build(mid+1, r); PushUp(rt); return rt; } void copy(int d, int s) { lson[d] = lson[s]; rson[d] = rson[s]; delta[d] = delta[s]; sum[d] = sum[s]; } int Update(int rt, int L, int R, int val, int l, int r) { int nrt = tot++; copy(nrt, rt); sum[nrt] += 1LL * val * (R - L + 1); if (L==l && R==r) { delta[nrt] += val; return nrt; } int mid = (l + r) >> 1; if (R <= mid) { lson[nrt] = Update(lson[rt], L, R, val, l, mid); } else if (L > mid) { rson[nrt] = Update(rson[rt], L, R, val, mid+1, r); } else { lson[nrt] = Update(lson[rt], L, mid, val, l, mid); rson[nrt] = Update(rson[rt], mid+1, R, val, mid+1, r); } return nrt; } __int64 Query(int rt, int L, int R, int l, int r) { if (L==l && R==r) { return sum[rt]; } int mid = (l + r) >> 1; __int64 ret = 1LL * (R-L+1) * delta[rt]; if (R <= mid) { ret += Query(lson[rt], L, R, l, mid); } else if (L > mid) { ret += Query(rson[rt], L, R, mid+1, r); } else { ret += Query(lson[rt], L, mid, l, mid); ret += Query(rson[rt], mid+1, R, mid+1, r); } return ret; } void solve() { int cur = 0; char op[4]; int l, r, d, t; __int64 ans; init(); T[0] = Build(1, n); while (q--) { scanf("%s", op); if (op[0] == 'B') { scanf("%d", &cur); } else if (op[0] == 'Q') { scanf("%d %d", &l, &r); t = cur; ans = Query(T[t], l, r, 1, n); printf("%I64d\n", ans); } else if (op[0] == 'H') { scanf("%d %d %d", &l, &r, &t); ans = Query(T[t], l, r, 1, n); printf("%I64d\n", ans); } else { scanf("%d %d %d", &l, &r, &d); T[cur+1] = Update(T[cur], l, r, d, 1, n); ++cur; } } } int main() { ios::sync_with_stdio(false); #ifndef ONLINE_JUDGE freopen("data.in", "r", stdin); freopen("data.out", "w", stdout); #endif while (scanf("%d %d", &n, &q)!=EOF) { rep(i, 1, n+1) scanf("%d", &a[i]); solve(); } #ifndef ONLINE_JUDGE printf("time = %d.\n", (int)clock()); #endif return 0; }
相关文章推荐
- 刷题、OJ 1932 母牛的故事
- java基础巩固笔记(5)-多线程之传统多线程
- 抽象类里面的三种方法
- 教父2-英文版
- 【C语言】C语言运算符
- JavaScript 笔记 4 - 运算符
- JAVA 冒泡法排序
- 【Hibernate系列】(五):关联映射之多对一
- static关键字
- 【C语言】C语言运算符
- <老友记>学习笔记
- hdu 1325 Is It A Tree?【并查集】
- 设计模式之访问者模式
- 常用开发辅助工具推荐
- 源代码管理工具的使用心得
- vim精通
- 【三层架构】三层总结(知识型)
- 【VB6】VB6类库项目中的MTSTransactionMode
- 越狱Season 1- Episode 22: Flight
- 培训课程大纲