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 ...
随机推荐
- codeforces round 416 div2 补题 CF 811 A B C D E
A. Vladik and Courtesy 水题略过 #include<cstdio> #include<cstdlib> #include<cmath> usi ...
- 洛谷 P2678 [ NOIP 2015 ] 跳石头 —— 二分答案
题目:https://www.luogu.org/problemnew/show/P2678 二分答案. 代码如下: #include<iostream> #include<cstd ...
- bzoj3450 Easy(概率期望dp)
3450: Tyvj1952 Easy Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 876 Solved: 648[Submit][Status] ...
- loadrunner乱码解决
对于Virtual User Generator,本机编码方式为GB2312,GBK,GB18030,因此要修改为utf-8 1.录制过程产生的乱码解决方法: 在tool→recording opti ...
- C# 的占位符
static void Main(string[] args) { Console.WriteLine("A:{0},a:{1}",65,97); Console.ReadLine ...
- 用 NPOI 组件实现数据导出
利用 Nuget 安装 NPOI 组件. 所需引用的 dll:ICSharpCode.SharpZipLib.dll.NPOI.dll.NPOI.OOXML.dll.NPOI.OpenXml4Net. ...
- SVN版本库的备份及迁移
备份某个版本库:打开控制台窗口 1.备份某个版本库: svnadmin dump myrepos > dumpfile //将指定的版本库导出成文件dumpfile eg:svnadmin du ...
- visual studio 2015安装
问题:安装过程老是报:安装包丢失或者损坏,但是去虚拟光驱里面可以查找到该安装包. 解决:可能文件下载ISO过程中丢失了一些数据.使用“Hash(MD5校验工具)”检测文件的“SHA-1”值,然后与官网 ...
- elastic-job 的简单使用
说明:这个是使用2.1.5版本 elastic-job是当当开源的的的定时任务,使用也是很简单的,可以解决数据量的大的时候可以分片执行,多应用节点部署时候不会重复执行. 是通过zookeeper作为控 ...
- IIS配置负载均衡
一.下载Nginx安装包 二.修改nginx.conf文件信息 如图: 三.重新加载Nginx (nginx -s reload) 启动Nginx: start nginx 停止Nginx:nginx ...