POJ 3468 A Simple Problem with Integers(线段树水题)
Time Limit: 5000MS | Memory Limit: 131072K | |
Total Submissions: 135904 | Accepted: 42113 | |
Case Time Limit: 2000MS |
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 5
- 1 2 3 4 5 6 7 8 9 10
- Q 4 4
- Q 1 10
- Q 2 4
- C 3 6 3
- Q 2 4
Sample Output
- 4
- 55
- 9
- 15
思路:线段树水题,建议手写线段树,熟悉模板,注意数据需要使用long long
- #include<string>
- #include<iostream>
- #include<algorithm>
- #define lson l,m,rt<<1
- #define rson m+1,r,rt<<1|1
- #define ll long long
- using namespace std;
- const int maxn = 1e5 + ;
- struct Tree{
- ll l, r, w, f;
- }tree[maxn << ];
- ll ans;
- inline void PushDown(int rt)
- {
- tree[rt << ].f += tree[rt].f;
- tree[rt << | ].f += tree[rt].f;
- tree[rt << ].w += tree[rt].f*(tree[rt << ].r - tree[rt << ].l + );
- tree[rt << | ].w += tree[rt].f*(tree[rt << | ].r - tree[rt << | ].l + );
- tree[rt].f = ;
- }
- void build(int l, int r, int rt)
- {
- tree[rt].l = l;
- tree[rt].r = r;
- tree[rt].f = ;
- if (l == r){
- cin >> tree[rt].w;
- return;
- }
- int m = (l + r) >> ;
- build(lson);
- build(rson);
- tree[rt].w = tree[rt << ].w + tree[rt << | ].w;
- }
- void update(int L, int R, int l, int r, int rt)
- {
- if (L <= l&& r <= R){
- tree[rt].w += ans*(r - l + );
- tree[rt].f += ans;
- return;
- }
- if (tree[rt].f)PushDown(rt);
- ll m = (l + r) >> ;
- if (L <= m)update(L, R, lson);
- if (R > m) update(L, R, rson);
- tree[rt].w = tree[rt << ].w + tree[rt << | ].w;
- }
- ll query(ll L, ll R, ll l, ll r, ll rt)
- {
- if (L <= l&&r <= R){
- return tree[rt].w;
- }
- if (tree[rt].f)PushDown(rt);
- ll m = (l + r) >> , cnt = ;
- if (L <= m)cnt += query(L, R, lson);
- if (R > m)cnt += query(L, R, rson);
- return cnt;
- }
- void Print(int l, int r, int rt)
- {
- if (l == r){
- cout << rt << " = " << tree[rt].w << endl;
- return;
- }
- //cout << rt << " = " << tree[rt].w << endl;
- int m = (l + r) >> ;
- if (l <= m)Print(lson);
- if (r > m)Print(rson);
- }
- int main()
- {
- std::ios::sync_with_stdio(false);
- ll n, q;
- cin >> n >> q;
- build(, n, );
- string flag; ll a, b;
- while (q--){
- cin >> flag >> a >> b;
- if (flag == "C"){
- cin >> ans;;
- update(a, b, , n, );
- //Print(1, n, 1);
- }
- else if (flag == "Q"){
- cout << query(a, b, , n, ) << endl;
- }
- }
- return ;
- }
POJ 3468 A Simple Problem with Integers(线段树水题)的更多相关文章
- poj 3468 A Simple Problem with Integers 线段树区间加,区间查询和
A Simple Problem with Integers Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://poj.org/problem?i ...
- poj 3468 A Simple Problem with Integers 线段树区间加,区间查询和(模板)
A Simple Problem with Integers Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://poj.org/problem?i ...
- poj 3468 A Simple Problem with Integers 线段树第一次 + 讲解
A Simple Problem with Integers Description You have N integers, A1, A2, ... , AN. You need to deal w ...
- [POJ] 3468 A Simple Problem with Integers [线段树区间更新求和]
A Simple Problem with Integers Description You have N integers, A1, A2, ... , AN. You need to deal ...
- poj 3468 A Simple Problem with Integers (线段树区间更新求和lazy思想)
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 75541 ...
- POJ 3468 A Simple Problem with Integers(线段树 成段增减+区间求和)
A Simple Problem with Integers [题目链接]A Simple Problem with Integers [题目类型]线段树 成段增减+区间求和 &题解: 线段树 ...
- POJ 3468 A Simple Problem with Integers //线段树的成段更新
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 59046 ...
- poj 3468 A Simple Problem with Integers 线段树加延迟标记
A Simple Problem with Integers Description You have N integers, A1, A2, ... , AN. You need to deal ...
- poj 3468 A Simple Problem with Integers 线段树区间更新
id=3468">点击打开链接题目链接 A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072 ...
- POJ 3468 A Simple Problem with Integers(线段树,区间更新,区间求和)
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 67511 ...
随机推荐
- Could not find modernizr-2.6.2 in any of the sources
- Linux系统下 为命令配置别名
1.什么是别名 在管理和维护Linux系统的过程中,将会使用到大量命令,有一些很长的命令或用法经常被用到,重复而频繁的输入某个很长命令或用法是不可取的.这时可以使用 别名 功能将这个过程简单化. Li ...
- HTML5移动Web开发
1. 响应式web设计 说到这个,移动开发面对的屏幕尺寸那叫一个丰富,其中安卓阵营就够让人头痛的.我们在PC端常用的两种布局方式就是固定布局和弹性布局,前者设置一个绝大多数电脑能正常显示的固定宽度居中 ...
- 【weiphp】安装中报错
问题描述:安装的第三部报错“SQLSTATE[HY000]: General error: 2030 This command is not supported in the prepared sta ...
- HDU4947GCD Array(莫比乌斯反演+树状数组)
题面 传送门 题解 orz ljz 相当于每一个数要加上 \[v\times [\gcd(i,n)=d]=v\times [\gcd(i/d,n/d)=1]=v\times \sum_{p|{i\ov ...
- DFS HDU 5305 Friends
题目传送门 /* 题意:每个点都要有偶数条边,且边染色成相同的两部分,问能有多少种染色方法 DFS+剪枝:按照边数来DFS,每种染色数为该点入度的一半,还有如果点不是偶数边就不DFS 这是别人的DFS ...
- ACM_物品分堆(01背包)
物品分堆 Time Limit: 2000/1000ms (Java/Others) Problem Description: 有n个物品,物品i的重量为Wi,现在想要把这个n个物品分类两堆,求最小的 ...
- S - Cyclic Components (并查集的理解)
Description You are given an undirected graph consisting of nn vertices and mm edges. Your task is t ...
- 清除WebSphere部署应用所对应的JSP缓存
Web应用部署在WebSphere Application Server v8.5后程序一般放置在<AppServer>/profiles/<profile_name>/ins ...
- jquery实现文字自动向上滚动,鼠标放上去停止,移开继续滚动代码...
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...