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);} elseif (opt == 2) {scanf("%lld", &val);first_value += val;} elseif (opt == 3) {scanf("%lld", &val);first_value -= val;} elseif (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;
}

转载于:https://www.cnblogs.com/shenxiaohuang/p/11221149.html

『题解』洛谷P2357 守墓人相关推荐

  1. 『题解』洛谷P3958 奶酪

    Portal Portal1: Luogu Portal2: LibreOJ Portal3: Vijos Description 现有一块大奶酪,它的高度为\(h\),它的长度和宽度我们可以认为是无 ...

  2. 洛谷 P2357 守墓人

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

  3. 洛谷P2357 守墓人

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

  4. 洛谷 P2357 守墓人(树状数组)

    树状数组区间更新,区间查询的入门好题 const int N=2e5+5;int i,j,k;int n,m,t;ll a[N]; ll c[N][2];ll sum[N];void add(int ...

  5. 洛谷P2357 守墓人(差分+树状数组)

    原题链接 什么是差分? 7 8 6 5 8 18 20 35 //原数组 7 1 -2 -1 3 10 2 15 //差分数组 差分数组的前缀sum[i]即原数组的a[i] 我们构建两个树状数组 su ...

  6. [洛谷] P2357 守墓人

    原题 第一张图把我吓到了/kk 这道题就是我们最最喜爱(恶心)的线段树模板. 共5种操作: 1. 格式:1 l r k 表示区间[l,r]加上k; 2. 格式:2 val 表示主墓碑风水值加上val; ...

  7. NOIP2010关押罪犯题解(洛谷P1525) (并查集)

    NOIP2010关押罪犯题解(洛谷P1525) (并查集) 日常膜拜dalao:财神万岁!!!!!!!!!!!!!!!!!!!!! 日常凌晨三点水题解..(原谅我中间断更了几天,,马上分班考试了竞赛顾 ...

  8. 【题解】洛谷P4168 [Violet]蒲公英 (分块)

    [题解]洛谷P4168 [Violet]蒲公英 (分块)     D e s c r i p t i o n \rm Description Description 我们把所有的蒲公英看成一个长度为 ...

  9. 三连击(升级版)题解(洛谷P1618)

    看了洛谷的几篇题解之后,感觉自己的代码思路更明确,洛谷那边也交不上题解了,就只好写在这里咯~ 先直接放题目吧~ 思路 当模拟题来做,先枚举第一个数,首先要明确对一个数是否合法的几个条件: 1. 各个位 ...

最新文章

  1. java uml图中的关系_UML类图中的关系
  2. 43 | 发挥人的潜能:探索式测试
  3. js仿QQ中对联系人向左滑动、滑出删除按钮的操作
  4. java中运算类型_Java数据类型及运算
  5. PIC单片机入门_PICC头文件介绍
  6. Dev 等待提示 WaitDialogForm 升级版
  7. android 标准字体,文字规范标准(IOS/Android)
  8. 演练 影视演员简介 0929
  9. AI队列长度检测:使用YOLO进行视频中的对象检测
  10. php7.0不出结合项,帝国CMS结合项提示“您来自的链接不存在”
  11. 小学计算机课的微案例,全国中小学信息技术课程教学案例大赛获奖作品 趣味造型制作.doc...
  12. 印象笔记如何与微信连接到服务器,如何保存微信和微博到印象笔记?
  13. 镇海计算机信息编程,镇海区加工中心编程培训
  14. 数字万用表常用功能使用
  15. 车牌号测试打分最准确的软件,车牌号码吉凶测试
  16. stm32h7 串口idle_【STM32H7教程】第30章 STM32H7的USART应用之八个串口FIFO实现
  17. Web 2.0概念地图-from Tim Oreilly
  18. 如何学习大数据!!我要做大数据! 1
  19. Web前端:什么是Web开发?
  20. 2015年上半年系统集成项目管理工程师案例计算题精讲视频(乔俊峰)

热门文章

  1. 应该手动抛出什么异常?RuntimeException?
  2. 廖雪峰python教程学习之习题解析
  3. linux下连接edb数据库,反汇编及linux下edb的下载
  4. 微信怎么解绑手机号?手把手教你具体操作步骤
  5. “联创黔线”杯大数据应用创新大赛
  6. Windows环境配置
  7. 网络安全——Burp Suite抓包工具的使用
  8. 智联卓聘 卓聘聊聊(IM)开发实践
  9. 绿幕虚拟直播,直播时代的风口
  10. 【LA3523 训练指南】圆桌骑士 【双连通分量】