A Simple Problem with Integers(线段树入门题)
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
Hint
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <cmath>
- #include <algorithm>
- #include <string>
- #include <vector>
- #include <stack>
- #include <queue>
- #include <set>
- #include <map>
- #include <list>
- #include <iomanip>
- #include <cstdlib>
- #include <sstream>
- using namespace std;
- typedef long long LL;
- const int INF=0x5fffffff;
- const double EXP=1e-;
- const int MS=;
- struct node
- {
- int l,r;
- LL sum,inc; //特别注意这里
- int mid()
- {
- return (l+r)/;
- }
- }nodes[*MS];
- void creat(int root,int l,int r)
- {
- nodes[root].l=l;
- nodes[root].r=r;
- nodes[root].sum=;
- nodes[root].inc=;
- if(l==r)
- return ;
- creat(root<<,l,(l+r)/);
- creat(root<<|,(l+r)/+,r);
- }
- void insert(int root,int pos,int value)
- {
- if(nodes[root].l==nodes[root].r)
- {
- nodes[root].sum+=value;
- return ;
- }
- nodes[root].sum+=value;
- if(pos<=nodes[root].mid())
- insert(root<<,pos,value);
- else
- insert(root<<|,pos,value);
- }
- void add(int root,int a,int b,int c)
- {
- if(nodes[root].l==a&&nodes[root].r==b)
- {
- nodes[root].inc+=c;
- return ;
- }
- nodes[root].sum+=c*(b-a+);
- if(b<=nodes[root].mid())
- add(root<<,a,b,c);
- else if(a>nodes[root].mid())
- add(root<<|,a,b,c);
- else
- {
- add(root<<,a,nodes[root].mid(),c);
- add(root<<|,nodes[root].mid()+,b,c);
- }
- }
- LL query(int root,int a,int b)
- {
- if(nodes[root].l>=a&&nodes[root].r<=b)
- return nodes[root].sum+nodes[root].inc*(nodes[root].r-nodes[root].l+);
- nodes[root].sum+=nodes[root].inc*(nodes[root].r-nodes[root].l+);
- add(root<<,nodes[root].l,nodes[root].mid(),nodes[root].inc);
- add(root<<|,nodes[root].mid()+,nodes[root].r,nodes[root].inc);
- nodes[root].inc=;
- if(b<=nodes[root].mid())
- return query(root<<,a,b);
- else if(a>nodes[root].mid())
- return query(root<<|,a,b);
- else
- return query(root<<,a,nodes[root].mid())+query(root<<|,nodes[root].mid()+,b);
- }
- int main()
- {
- int N,Q,x,y,z;
- scanf("%d%d",&N,&Q);
- creat(,,N);
- for(int i=;i<=N;i++)
- {
- scanf("%d",&x);
- insert(,i,x);
- }
- char cmd[MS];
- while(Q--)
- {
- scanf("%s",cmd);
- if(cmd[]=='Q')
- {
- scanf("%d%d",&x,&y);
- printf("%lld\n",query(,x,y));
- }
- else
- {
- scanf("%d%d%d",&x,&y,&z);
- add(,x,y,z);
- }
- }
- return ;
- }
A Simple Problem with Integers(线段树入门题)的更多相关文章
- 2018 ACMICPC上海大都会赛重现赛 H - A Simple Problem with Integers (线段树,循环节)
2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 H - A Simple Problem with Integers (线段树,循环节) 链接:https://ac.nowcoder.co ...
- POJ3648 A Simple Problem with Integers(线段树之成段更新。入门题)
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 53169 Acc ...
- 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 [题目链接]A Simple Problem with Integers [题目类型]线段树 成段增减+区间求和 &题解: 线段树 ...
- poj3468 A Simple Problem with Integers (线段树区间最大值)
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 92127 ...
- 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 线段树,树状数组
题目:http://poj.org/problem?id=3468 A Simple Problem with Integers Time Limit: 5000MS Memory Limit ...
- [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 ——线段树 成段更新 懒惰标记
A Simple Problem with Integers Time Limit:5000MS Memory Limit:131072K Case Time Limit:2000MS Descr ...
随机推荐
- hdu 3038 How Many Answers Are Wrong
http://acm.hdu.edu.cn/showproblem.php?pid=3038 How Many Answers Are Wrong Time Limit: 2000/1000 MS ( ...
- Codeforces Round #245 (Div. 1) B. Working out (简单DP)
题目链接:http://codeforces.com/problemset/problem/429/B 给你一个矩阵,一个人从(1, 1) ->(n, m),只能向下或者向右: 一个人从(n, ...
- Ubuntu12.04 使用中遇到的问题
这个随笔回记录使用Ubuntu遇到的一些问题 不定期进行整理和分类 1.Question: ubuntu 无法检测包或者源码包 Description:Ubuntu软件中心打开时报错 无法检 ...
- TypeScript学习笔记(五):接口
使用接口 在前面的笔记中我们知道可以使用Object Type来指定参数的属性,如下: function printLabel(labelledObj: {label: string}) { cons ...
- Spring启动时加载数据
程序中也许有会有许多常用的,不会经常更改的数据,我们可以在程序初始化的时候就把他们加载,就不用频繁的加载或者查询. 以下是几个常用的,有COPY收集的,也有自己弄. 1. 实现BeanPostProc ...
- SQLite本地事务处理
private void toolStripButton1_Click(object sender, EventArgs e) { //判断新增的年度是否已经存在 if (HasYear()) { M ...
- Python魔术师--self
(原文是 Python's Magical Self ,来自 http://concentricsky.com ) Python的self参数有时真让人抓狂,比如,你必须在每一个类的方法里显示定义se ...
- C#不错的扩展工具类
FSLibExtension.NET https://github.com/iccfish/FSLib.Extension WebEssentials2013 https://github.com/i ...
- VIM复制粘贴大全!
原文地址:http://lsong17.spaces.live.com/blog/cns!556C21919D77FB59!603.entry 内容: 用vim这么久 了,始终也不知道怎么在vim中使 ...
- cocos2d-x CCTableView
转自:http://www.cnblogs.com/dcxing/archive/2013/01/16/2862068.html CCTableView在游戏中一般用在背包这样场景或层中,当然也不止这 ...