Portal

Portal1: Luogu

Description

在一个荒凉的墓地上有一个令人尊敬的守墓人,他看守的墓地从来没有被盗过, 所以人们很放心的把自己的先人的墓安顿在他那守墓人能看好这片墓地是必然而不是偶然.....

因为....守墓人懂风水。他把墓地分为主要墓碑和次要墓碑,主要墓碑只能有\(1\)个, 守墓人把他记为\(1\)号, 而次要墓碑有\(n-1\)个,守墓人将之编号为\(2, 3 \dots n\),所以构成了一个有\(n\)个墓碑的墓地。

而每个墓碑有一个初始的风水值,这些风水值决定了墓地的风水的好坏,所以守墓人需要经常来查询这些墓碑。

善于运用风水的守墓人,通过一次次逆天改命,使得自己拥有了无限寿命,没人知道他活了多久。

这天,你幸运的拜访到了他,他要求你和他共同见证接下来几年他的战果,但不过他每次统计风水值之和都需要你来帮他计算,算错了他会要你命QAQ,风水也不是不可变,除非遭遇特殊情况,已知在接下来的\(2147483647\)年里,会有\(n\)次灾难,守墓人会有几个操作:

  1. 将\([l,r]\)这个区间所有的墓碑的风水值增加\(k\);

  2. 将主墓碑的风水值增加\(k\);

  3. 将主墓碑的风水值减少\(k\);

  4. 统计\([l,r]\)这个区间所有的墓碑的风水值之和;

  5. 求主墓碑的风水值。

上面也说了,很多人会把先人的墓安居在这里,而且守墓人活了很多世纪,墓碑的数量会多的你不敢相信,守墓人和善的邀请你帮他完成这些操作,要不然哪天你的旅馆爆炸了,天上下刀子\(\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 守墓人的更多相关文章

  1. 『题解』洛谷P1063 能量项链

    原文地址 Problem Portal Portal1:Luogu Portal2:LibreOJ Portal3:Vijos Description 在\(Mars\)星球上,每个\(Mars\)人 ...

  2. 『题解』洛谷P1993 小K的农场

    更好的阅读体验 Portal Portal1: Luogu Description 小\(K\)在\(\mathrm MC\)里面建立很多很多的农场,总共\(n\)个,以至于他自己都忘记了每个农场中种 ...

  3. 『题解』洛谷P2296 寻找道路

    更好的阅读体验 Portal Portal1: Luogu Portal2: LibreOJ Description 在有向图\(\mathrm G\)中,每条边的长度均为\(1\),现给定起点和终点 ...

  4. 『题解』洛谷P1351 联合权值

    更好的阅读体验 Portal Portal1: Luogu Portal2: LibreOJ Description 无向连通图\(\mathrm G\)有\(n\)个点,\(n - 1\)条边.点从 ...

  5. 『题解』洛谷P2170 选学霸

    更好的阅读体验 Portal Portal1: Luogu Description 老师想从\(N\)名学生中选\(M\)人当学霸,但有\(K\)对人实力相当,如果实力相当的人中,一部分被选上,另一部 ...

  6. 『题解』洛谷P1083 借教室

    更好的阅读体验 Portal Portal1: Luogu Portal2: LibreOJ Portal3: Vijos Description 在大学期间,经常需要租借教室.大到院系举办活动,小到 ...

  7. 『题解』洛谷P1314 聪明的质监员

    更好的阅读体验 Portal Portal1: Luogu Portal2: LibreOJ Portal3: Vijos Description 小T是一名质量监督员,最近负责检验一批矿产的质量.这 ...

  8. 『题解』洛谷P3376 【模板】网络最大流

    Problem Portal Portal1:Luogu Description 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. Input 第一行包含四个正整数\(N,M,S,T\),分 ...

  9. 『题解』洛谷P3384 【模板】树链剖分

    Problem Portal Portal1: Luogu Description 如题,已知一棵包含\(N\)个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作\(1\): ...

随机推荐

  1. Linux虚拟机中配置JDK环境变量(Ubuntu系统)

    首先通过Xshell中文件传输想你的虚拟机上传你的jdk,如图所示:(需要本机安装Xftp:链接: https://pan.baidu.com/s/1sWHmywZ2C6V2n4aa1FqqFg 提取 ...

  2. 一篇文章教会你jQuery应用

    一 认识jQuery jQuery是JavaScript Query的缩写形式.jQuery是一款非常优秀的JavaScript库,即便是MVVM框架盛行的今天,也有超过半数的网页及应用直接或间接的使 ...

  3. 单元测试实践(SpringCloud+Junit5+Mockito+DataMocker)

    网上看过一句话,单元测试就像早睡早起,每个人都说好,但是很少有人做到.从这么多年的项目经历亲身证明,是真的. 这次借着项目内实施单元测试的机会,记录实施的过程和一些总结经验. 项目情况 首先是背景,项 ...

  4. Hibernate HQL注入与防御(ctf实例)

    遇到一个hql注入ctf题    这里总结下java中Hibernate HQL的注入问题. 0x01 关于HQL注入 Hibernate是一种ORM框架,用来映射与tables相关的类定义(代码) ...

  5. Web安全之url跳转漏洞及bypass总结

    0x01 成因 对于URL跳转的实现一般会有几种实现方式: META标签内跳转 javascript跳转 header头跳转 通过以GET或者POST的方式接收将要跳转的URL,然后通过上面的几种方式 ...

  6. spring源码系列8:AOP源码解析之代理的创建

    回顾 首先回顾: JDK动态代理与CGLIB动态代理 Spring中的InstantiationAwareBeanPostProcessor和BeanPostProcessor的区别 我们得知 JDK ...

  7. ‎Cocos2d-x 学习笔记(21.1) ScrollView “甩出”效果与 deaccelerateScrolling 方法

    1. 简介 “甩出”效果是当我们快速拖动container并松开后,container继续朝原方向运动,但是渐渐减速直到停止的效果. ScrollView的onTouchEnded方法会设置Timer ...

  8. cmake::helloworld

    ubuntu16. cmake安装 apt-get install cmake 1.创建 CMakeLists.txt , main.cpp 2.cmake . 生成 makefile 3.遇到错误c ...

  9. python中生成器与迭代器

    可迭代对象:一个实现了iter方法的对象是可迭代的 迭代器:一个实现了iter方法和next方法的对象就是迭代器 生成器都是Iterator对象,但list.dict.str虽然是Iterable(可 ...

  10. 百万年薪python之路 -- MySQL数据库之 MySQL行(记录)的操作(二) -- 多表查询

    MySQL行(记录)的操作(二) -- 多表查询 数据的准备 #建表 create table department( id int, name varchar(20) ); create table ...