博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ-3212 Pku3468 A Simple Problem with Integers 裸线段树区间维护查询
阅读量:4452 次
发布时间:2019-06-07

本文共 3315 字,大约阅读时间需要 11 分钟。

3212: Pku3468 A Simple Problem with Integers

Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 1278 Solved: 560
[Submit][Status][Discuss]

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

The sums may exceed the range of 32-bit integers.

题目大意:区间修改和区间查询

裸线段树毫无爆点

代码如下:

/**************************************************************    Problem: 3212    User: DaD3zZ    Language: C++    Result: Accepted    Time:48 ms    Memory:8304 kb****************************************************************/#include
#include
#include
#include
using namespace std;#define maxn 100001long long sum[maxn<<2]={
0},delta[maxn<<2]={
0};long long a[maxn]={
0};void updata(int now){ sum[now]=sum[now<<1]+sum[now<<1|1];}void build(int now,int l,int r){ if (l==r) { sum[now]=a[l]; return; } int mid=(l+r)>>1; build(now<<1,l,mid); build(now<<1|1,mid+1,r); updata(now);}void pushdown(int now,int ln,int rn){ if (delta[now]!=0) { delta[now<<1]+=delta[now]; delta[now<<1|1]+=delta[now]; sum[now<<1]+=delta[now]*ln; sum[now<<1|1]+=delta[now]*rn; delta[now]=0; }}void change(int L,int R,int now,int l,int r,long long data){ if (L<=l && R>=r) { sum[now]+=data*(r-l+1); delta[now]+=data; return; } int mid=(l+r)>>1; pushdown(now,mid-l+1,r-mid);//这里需要先下放一波标记不然会出错 if (L<=mid) change(L,R,now<<1,l,mid,data); if (R>mid) change(L,R,now<<1|1,mid+1,r,data); updata(now);}long long query(int L,int R,int now,int l,int r){ if (L<=l && R>=r) return sum[now]; int mid=(l+r)>>1; pushdown(now,mid-l+1,r-mid); long long total=0; if (L<=mid) total+=query(L,R,now<<1,l,mid); if (R>mid) total+=query(L,R,now<<1|1,mid+1,r); return total;}int main(){ int n,m; scanf("%d%d",&n,&m); for (int i=1; i<=n; i++) scanf("%lld",&a[i]); build(1,1,n); for (int i=1; i<=m; i++) { char c[3]; int l,r; scanf("%s",&c); scanf("%d%d",&l,&r); if (c[0]=='Q') { long long ans=query(l,r,1,1,n); printf("%lld\n",ans); } else { long long data; scanf("%lld",&data); change(l,r,1,1,n,data); } } return 0; }

转载于:https://www.cnblogs.com/DaD3zZ-Beyonder/p/5346242.html

你可能感兴趣的文章
强烈推荐美文之《从此刻起,我要》
查看>>
MYSQL中数据类型介绍
查看>>
评估软件上线标准
查看>>
敏捷开发流程
查看>>
APP兼容性测试(三)测试方案设计
查看>>
leetcode 412. Fizz Buzz
查看>>
对Netflix Ribbon的Loadbalancer类源码设计合理性的一点质疑
查看>>
关于日历的算法
查看>>
[QT编程]QT实现的一个渐隐渐显窗体
查看>>
在Web工程中引入Jquery插件报错解决方案
查看>>
大学总结之影响我最深的十本书
查看>>
用myEclipse连接数据源生成动态数据报表
查看>>
[myeclipse]@override报错问题
查看>>
자주 쓰이는 정규표현식
查看>>
超简单的listview单选模式SingleMode(自定义listview item)
查看>>
vue-11-路由嵌套-参数传递-路由高亮
查看>>
HDU 1199 - Color the Ball 离散化
查看>>
[SCOI2005]骑士精神
查看>>
Hibernate原理解析-Hibernate中实体的状态
查看>>
六时车主 App 隐私政策
查看>>