『题解』洛谷P2357 守墓人
Portal
Portal1: Luogu
Description
在一个荒凉的墓地上有一个令人尊敬的守墓人,他看守的墓地从来没有被盗过, 所以人们很放心的把自己的先人的墓安顿在他那守墓人能看好这片墓地是必然而不是偶然.....
因为....守墓人懂风水。他把墓地分为主要墓碑和次要墓碑,主要墓碑只能有\(1\)个, 守墓人把他记为\(1\)号, 而次要墓碑有\(n-1\)个,守墓人将之编号为\(2, 3 \dots n\),所以构成了一个有\(n\)个墓碑的墓地。
而每个墓碑有一个初始的风水值,这些风水值决定了墓地的风水的好坏,所以守墓人需要经常来查询这些墓碑。
善于运用风水的守墓人,通过一次次逆天改命,使得自己拥有了无限寿命,没人知道他活了多久。
这天,你幸运的拜访到了他,他要求你和他共同见证接下来几年他的战果,但不过他每次统计风水值之和都需要你来帮他计算,算错了他会要你命QAQ
,风水也不是不可变,除非遭遇特殊情况,已知在接下来的\(2147483647\)年里,会有\(n\)次灾难,守墓人会有几个操作:
将\([l,r]\)这个区间所有的墓碑的风水值增加\(k\);
将主墓碑的风水值增加\(k\);
将主墓碑的风水值减少\(k\);
统计\([l,r]\)这个区间所有的墓碑的风水值之和;
求主墓碑的风水值。
上面也说了,很多人会把先人的墓安居在这里,而且守墓人活了很多世纪,墓碑的数量会多的你不敢相信,守墓人和善的邀请你帮他完成这些操作,要不然哪天你的旅馆爆炸了,天上下刀子\(\dots \dots\)为了活命,还是帮他吧。
Input
第一行,两个正整数\(n, f\)表示共有\(n\)块墓碑,并且在接下来的\(2147483647\)年里,会有\(f\)次世界末日;
第二行,\(n\)个正整数,表示第\(i\)块墓碑的风水值;
接下来\(f\)行,每行都会有一个针对世界末日的解决方案,如题所述,标记同题。
Output
输出会有若干行,对\(4\)和\(5\)的提问做出回答。
Sample Input
5 7
0 0 0 0 0
1 1 5 1
1 1 3 3
2 3
3 1
4 1 5
2 1
5
Sample Output
16
7
Hint
\(20\%\)的数据满足:\(1 \le n \le 100\);
\(50\%\)的数据满足:\(1 \le n \le 6000\);
\(100\%\)的数据满足:\(1 \le n, f \le 2 \times 10^{5}\);
Solution
这题树状数组。
用c1[]
来维护和,c2[]
来维护积。
对于询问\([x, y]\)区间,可以用query(y) - query(x - 1) + (x == 1) * 主墓碑的风水值
来求值,其中query(y) - query(x - 1)
类似于前缀和,(x == 1) * 主墓碑的风水值
表示\([x, y]\)区间包不包含主墓碑,如果包含则加上主墓碑单独维护的。
其中主墓碑需要单独维护。
Code
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long LL;
const int MAXN = 500005;
int n, m, last;
LL first_value, c1[MAXN], c2[MAXN];
inline int lowbit(int x) {//树状数组专属操作
return x & -x;
}
inline void update(int x, LL val) {//更新
for (LL i = x; i <= n; i += lowbit(i)) {
c1[i] += val;
c2[i] += val * x;
}
}
inline LL query(int x) {//查询
LL ret = 0;
for (LL i = x; i; i -= lowbit(i))
ret += (x + 1) * c1[i] - c2[i];
return ret;
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) {
int x;
scanf("%d", &x);
update(i, x - last);
last = x;
}
while (m--) {
int opt, x, y;
LL val;
scanf("%d", &opt);
if (opt == 1) {
scanf("%d%d%lld", &x, &y, &val);
update(x, val);
update(y + 1, -val);
} else
if (opt == 2) {
scanf("%lld", &val);
first_value += val;
} else
if (opt == 3) {
scanf("%lld", &val);
first_value -= val;
} else
if (opt == 4) {
scanf("%d%d", &x, &y);
printf("%lld\n", query(y) - query(x - 1) + (x == 1) * first_value);
} else printf("%lld\n", query(1) + first_value);//统一维护的加单独维护的
}
return 0;
}
『题解』洛谷P2357 守墓人的更多相关文章
- 『题解』洛谷P1063 能量项链
原文地址 Problem Portal Portal1:Luogu Portal2:LibreOJ Portal3:Vijos Description 在\(Mars\)星球上,每个\(Mars\)人 ...
- 『题解』洛谷P1993 小K的农场
更好的阅读体验 Portal Portal1: Luogu Description 小\(K\)在\(\mathrm MC\)里面建立很多很多的农场,总共\(n\)个,以至于他自己都忘记了每个农场中种 ...
- 『题解』洛谷P2296 寻找道路
更好的阅读体验 Portal Portal1: Luogu Portal2: LibreOJ Description 在有向图\(\mathrm G\)中,每条边的长度均为\(1\),现给定起点和终点 ...
- 『题解』洛谷P1351 联合权值
更好的阅读体验 Portal Portal1: Luogu Portal2: LibreOJ Description 无向连通图\(\mathrm G\)有\(n\)个点,\(n - 1\)条边.点从 ...
- 『题解』洛谷P2170 选学霸
更好的阅读体验 Portal Portal1: Luogu Description 老师想从\(N\)名学生中选\(M\)人当学霸,但有\(K\)对人实力相当,如果实力相当的人中,一部分被选上,另一部 ...
- 『题解』洛谷P1083 借教室
更好的阅读体验 Portal Portal1: Luogu Portal2: LibreOJ Portal3: Vijos Description 在大学期间,经常需要租借教室.大到院系举办活动,小到 ...
- 『题解』洛谷P1314 聪明的质监员
更好的阅读体验 Portal Portal1: Luogu Portal2: LibreOJ Portal3: Vijos Description 小T是一名质量监督员,最近负责检验一批矿产的质量.这 ...
- 『题解』洛谷P3376 【模板】网络最大流
Problem Portal Portal1:Luogu Description 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. Input 第一行包含四个正整数\(N,M,S,T\),分 ...
- 『题解』洛谷P3384 【模板】树链剖分
Problem Portal Portal1: Luogu Description 如题,已知一棵包含\(N\)个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作\(1\): ...
随机推荐
- Label的作用是什么,是怎么用的?
label标签来定义表单控制间的关系,当用户选择该标签时,浏览器会自动将焦点转到标签相关的表单控件上. 如: <form> <label for="male"&g ...
- Python中的option Parser
一般来说,Python中有两个内建的模块用于处理命令行参数: 一个是 getopt,<Deep in python>一书中也有提到,只能简单处理 命令行参数: 另一个是 optparse, ...
- Linux内存描述之内存区域zone–Linux内存管理(三)
服务器体系与共享存储器架构 日期 内核版本 架构 作者 GitHub CSDN 2016-06-14 Linux-4.7 X86 & arm gatieme LinuxDeviceDriver ...
- 简单自定义mybatis流程!!
----简单自定义mybatis流程----一.首先封装daoMapperxml文件和sqlMapconfig配置文件,如何封装:(1).封装我们的Mapper.xml文件,提取名称空间namespa ...
- dubbo配置文件的加载顺序详解(图示)
Dubbo配置文件的加载顺序 在使用apache dubbo.version2.7.3 时,配置文件的加载情况.以provider提供服务者为例. 配置文件 ,以下四个配置文件. 其优先级 app ...
- Cocos2d-x 学习笔记(11.10) Spawn
Spawn让多个action同时执行. Spawn有多种不同的create方法,最终都调用了createWithTwoActions(FiniteTimeAction *action1, Finite ...
- mysql::批量入库
批量入库 INSERT INTO M_Signal (Signal_Id, Signal_Name) VALUES(,,'water') , , , , 'water') ON DUPLICATE K ...
- Vuex使用总结
Vuex 是什么? Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. Vuex的五个核心概念 ...
- Python 爬取豆瓣TOP250实战
学习爬虫之路,必经的一个小项目就是爬取豆瓣的TOP250了,首先我们进入TOP250的界面看看. 可以看到每部电影都有比较全面的简介.其中包括电影名.导演.评分等. 接下来,我们就爬取这些数据,并将这 ...
- .gitignore实现忽略提交