pku3468: A Simple Problem with Integers
来源:互联网 发布:淘宝钛锗手链 编辑:程序博客网 时间:2024/05/29 04:21
Description
You have N integers, A1, A2, ... ,AN. You need to deal with two kinds of operations. One type of operation is to add some given number to each number in a given interval. The other is to ask for the sum of numbers in a given interval.
Input
The first line contains two numbers N and Q. 1 ≤ N,Q ≤ 100000.
The second line contains N numbers, the initial values of A1,A2, ... , AN. -1000000000 ≤ Ai ≤ 1000000000.
Each of the next Q lines represents an operation.
"C a b c" means adding c to each of Aa, Aa+1, ... , Ab. -10000 ≤ c ≤ 10000.
"Q a b" means querying the sum of Aa, Aa+1, ... ,Ab.
Output
You need to answer all Q commands in order. One answer in a line.
Sample Input
10 51 2 3 4 5 6 7 8 9 10Q 4 4Q 1 10Q 2 4C 3 6 3Q 2 4
Sample Output
455915
Hint
Source
#include <iostream>#include <cstdio>using namespace std;struct node{ int l, r; __int64 sum, d;}v[500000];__int64 A[200000];int N, Q;//往上更新void pushup(int n){ v[n].sum = v[2*n].sum + v[2*n+1].sum;}//往下更新void pushdown(int n){ if (v[n].d != 0) { v[n*2].d+=v[n].d; v[n*2].sum+=(v[n*2].r-v[n*2].l+1)*v[n].d; v[n*2+1].d+=v[n].d; v[n*2+1].sum+=(v[n*2+1].r-v[n*2+1].l+1)*v[n].d; v[n].d=0; }}//建树void build(int l, int r, int n){ v[n].l = l; v[n].r = r; v[n].d = 0; if (r == l) { v[n].sum = A[r]; return ; } int mid = (l+r)/2; build(l, mid, 2*n); build(mid+1, r, 2*n+1); pushup(n);}void update(int l, int r, int d, int n){ if (l<=v[n].l && v[n].r<=r) { v[n].d += d; v[n].sum += (v[n].r - v[n].l + 1)*d; return ; } pushdown(n); int m = (v[n].l+v[n].r)/2; if (r <= m) update(l, r, d, 2*n); else if (l > m) update(l, r, d, 2*n+1); else { update(l, m, d, 2*n); update(m+1, r, d, 2*n+1); } pushup(n);}__int64 query(int l, int r, int n){ if (l<=v[n].l && v[n].r<=r) return v[n].sum; pushdown(n); int m = (v[n].l + v[n].r)/2; if (r <= m) return query(l, r, 2*n); else if (l > m) return query(l, r, 2*n+1); else return query(l, m, 2*n)+query(m+1, r, 2*n+1);}int main(){ char ch; int a, b, c; while (~scanf("%d %d", &N, &Q)) { for (int i=1; i<=N; i++) scanf("%I64d", &A[i]); build(1, N, 1); while (Q--) { getchar(); scanf("%c", &ch); if (ch == 'Q') { scanf("%d%d", &a, &b); printf("%I64d\n", query(a, b, 1)); } else { scanf("%d%d%d", &a, &b, &c); update(a, b, c, 1); } } } return 0;}
- pku3468: A Simple Problem with Integers
- [BZOJ3212]Pku3468 A Simple Problem with Integers
- [BZOJ3212] Pku3468 A Simple Problem with Integers
- 3212: Pku3468 A Simple Problem with Integers
- bzoj3212 Pku3468 A Simple Problem with Integers
- BZOJ 3212 Pku3468 A Simple Problem with Integers
- bzoj 3212: Pku3468 A Simple Problem with Integers 线段树
- BZOJ P3212 Pku3468 A Simple Problem with Integers
- BZOJ 3212 Pku3468 A Simple Problem with Integers 线段树
- bzoj 3212: Pku3468 A Simple Problem with Integers
- PKU3468(A Simple Problem with Integers)线段树的成段更新
- BZOJ-3212 Pku3468 A Simple Problem with Integers 裸线段树区间维护查询
- bzoj 3212: Pku3468 A Simple Problem with Integers (线段树)
- A Simple Problem with Integers
- A Simple Problem with Integers
- A Simple Problem with Integers
- A Simple Problem with Integers
- A Simple Problem with Integers
- 数据结构--顺序栈的基本操作
- Hot Weather
- 图文详解YUV420数据格式
- csapp2e 家庭作业 4.52 4.53
- 集合求取并集交集补集
- pku3468: A Simple Problem with Integers
- Android开发入门之采用ContentProvider对外共享数据
- JAVA语法总结 - 基本数据类型
- CSS总结
- nefu 2 打素数表
- ASP.NET产生随机验证码
- iOS 学习笔记 8 NSUserDefaults学习
- C的xml编程文章链接
- MSSQL2K - SQL Injector - Query String Parameter Attack结合netcat获得反向cmdshell