题目描述

在一个荒凉的墓地上

有一个令人尊敬的守墓人, 他看守的墓地从来

没有被盗过, 所以人们很放心的把自己的先人的墓

安顿在他那

守墓人能看好这片墓地是必然而不是偶然.....

因为....守墓人懂风水 0.0

他把墓地分为主要墓碑和次要墓碑, 主要墓碑

只能有 1 个, 守墓人把他记为 1 号, 而次要墓碑有

n-1 个,守墓人将之编号为 2,3...n,所以构成了一个有 n 个墓碑的墓地。

而每个墓碑有一个初始的风水值,这些风水值决定了墓地的风水的好坏,所以守墓人

需要经常来查询这些墓碑。

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

他活了多久。

这天,你幸运的拜访到了他,他要求你和他共同见证接下来几年他的战果,但不过他

每次统计风水值之和都需要你来帮他计算,算错了他会要你命 QAQ

风水也不是不可变,除非遭遇特殊情况,已知在接下来的 2147483647 年里,会有 n 次

灾难,守墓人会有几个操作:

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

2.将主墓碑的风水值增加 k

3.将主墓碑的风水值减少 k

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

5.求主墓碑的风水值

上面也说了,很多人会把先人的墓安居在这里,而且守墓人活了很多世纪→_→,墓碑

的数量会多的你不敢相信= =

守墓人和善的邀请你帮他完成这些操作,要不然哪天你的旅馆爆炸了,天上下刀子.....

为了活命,还是帮他吧

输入输出格式

输入格式:

第一行,两个正整数 n,f 表示共有 n 块墓碑,并且在接下来的

2147483647 年里,会有 f 次世界末日

第二行,n 个正整数,表示第 i 块墓碑的风水值

接下来 f 行,每行都会有一个针对世界末日的解决方案,如题所述,标记同题

输出格式:

输出会有若干行,对 4 和 5 的提问做出回答

输入输出样例

输入样例#1:

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

输出样例#1:

16
7

说明

20%的数据满足:1≤n≤100

50%的数据满足:1≤n≤6000

100%的数据满足:1≤n,f≤2*10^5

思路:这不是裸的线段树吗?但是我不会啊........那就用树状数组来搞吧。我的上篇博客用树状数组实现了线段树的区间修改区间查询功能,那就直接拿到这道题上用用。该题需要实现单点查询、区间查询、区间修改、单点修改功能,但是我用树状数组只实现了区间与单点查询。还差一个单点修改功能,另开一个数组实现吗?注意基础功能实现是建立在树状数组单点修改区间查询的基础上的,所以tree数组中存储的是差分值,所以把单点以区间的方式处理,注意需要修改数组p中tree[i]*(i-1)的前缀和。

加输入挂用时252ms,还行。

树状数组代码如下:

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<iostream>
using namespace std;
#define INF 0x3f3f3f3f
#define ll long long
#define per(i,a,b) for(long long int i=a;i<=b;++i)
ll int n,m,tree[2000010],p[2000010];
ll int lowbit(ll int k)
{return k&(-k);
}
void add(ll int x,ll int k,int fag)
{while(x<=n){if(fag==1) tree[x]+=k;else p[x]+=k;x+=lowbit(x);}
}
ll int sum(ll int x,int fag)
{ll int s=0;while(x!=0){if(fag==1) s+=tree[x];else s+=p[x];x-=lowbit(x);}return s;
}
int main()
{scanf("%lld%lld",&n,&m);ll int x,y=0;per(i,1,n) {//ll int x,y;scanf("%lld",&x);y=x-y;add(i,y,1);//区间查询单点修改,前缀和为该位置的值 add(i,(i-1)*y,2);//前缀和差值部分 y=x;} per(i,1,m){ll int a,b,c,d;scanf("%lld",&a);if(a==1){scanf("%lld%lld%lld",&b,&c,&d);add(b,d,1);add(c+1,-d,1);//正常的插入 add(b,d*(b-1),2);add(c+1,-d*c,2);//正常的维护 }if(a==2) {scanf("%lld",&b);add(1,b,1);add(2,-b,1);add(2,-b,2);}if(a==3){scanf("%lld",&b);add(1,-b,1);add(2,b,1);add(2,b,2);}if(a==4){scanf("%lld%lld",&b,&c);printf("%lld\n",(c*sum(c,1)-(b-1)*sum(b-1,1))-(sum(c,2)-sum(b-1,2)));}if(a==5) printf("%lld\n",sum(1,1));}return 0;
}

线段树代码如下:

P2357 守墓人(树状数组/线段树)相关推荐

  1. D-query SPOJ - DQUERY(求区间不同数的个数)(树状数组||线段树+离散)(主席树+在线)

    English Vietnamese Given a sequence of n numbers a1, a2, -, an and a number of d-queries. A d-query ...

  2. 差分+树状数组 线段树【P2357】 守墓人

    题目描述-->p2357 守墓人 敲了一遍线段树,水过. 树状数组分析 主要思路: 差分 简单介绍一下差分(详细概念太麻烦,看下面. 给定一个数组 7 8 6 5 1 8 18 20 35 // ...

  3. HDU 1556 前缀和 树状数组 线段树

    解法一: a[i]表示以 i作为起点,对 i-n的气球全部上色的次数  对(start,end)区间上色 ++a[start] --a[end+1]抵消掉 end+1-n的部分 问题转换为求 a的前缀 ...

  4. jzoj3854-分组【树状数组,线段树】

    正题 题目链接:https://jzoj.net/senior/#contest/show/2990/2 题目大意 一个小队满足要求 队长的地位最高 所有队员和队长的年龄差不超过kkk 给出nnn个人 ...

  5. 模板三连击:树状数组+线段树+主席树

    没事儿干,复习模板...... 1.树状数组 本来不想写这个的,但是反正就几分钟就打完了,所以就写了,水AC数. 洛谷 P3374 [模板]树状数组 1 1 #include<cstdio> ...

  6. 51nod 1680区间求和 (dp+树状数组/线段树)

    不妨考虑已知一个区间[l,r]的k=1.k=2....k=r-l+1这些数的答案ans(只是这一个区间,不包含子区间) 那么如果加入一个新的数字a[i](i = r+1) 则新区间[l, i]的答案为 ...

  7. CCF201709-5 除法(100分)【树状数组+线段树】

    试题编号: 201709-5 试题名称: 除法 时间限制: 10.0s 内存限制: 256.0MB 问题描述: 问题描述 小葱喜欢除法,所以他给了你N个数a1, a2, ⋯, aN,并且希望你执行M次 ...

  8. POJ2182 HDU2711 Lost Cows【树状数组+线段树】

    Lost Cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 17113 Accepted: 10664 Descripti ...

  9. [CSP-S模拟测试]:影魔(树状数组+线段树合并)

    题目背景 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万. 千百年来,他收集了各式各样的灵魂,包括诗人.牧师.帝王.乞丐.奴隶.罪人,当然,还有英雄. 每一个灵魂,都有着 ...

最新文章

  1. 点云python-pcl
  2. Matlab与数据结构 -- 搜索向量或矩阵中非零元素的位置
  3. linux进程khungtaskd,Linux查看进程的所有信息的方法示例
  4. 格式化输出中的%s和%S的区别
  5. 什么是nginx负载均衡高可用
  6. 智能小车37:异常在ARM、JAVA、硬件里的实现
  7. 对任意长度字符串,删除其中的任意的N(N=0)个字符
  8. 利用memoize缓存到Redis出现多个参数同一个结果
  9. U盘无法格式化,变成8M,RAW格式,0字节的U盘修复教程
  10. 双人贪吃蛇java 代码_java 双人贪吃蛇
  11. Music Radio Beta-Perview 1.0.0.0.(做了一个听音乐电台的东东.:)
  12. MobaXterm快捷输入
  13. eclipse常用快捷键和设置
  14. 正交解调 matlab,13.1.1 正交调制解调
  15. Android开发常见面试
  16. APP开发学习思路指导
  17. Oracle 判断正负数函数 sign
  18. 【数字信号】基于matlab GUI DTMF电话模拟系统(频谱图+时域图+语谱图)【含Matlab源码 2092期】
  19. Android利用贝塞尔曲线实现翻书效果(适配AndroidX)
  20. Win10右键清空剪贴板

热门文章

  1. 2017暑假第二阶段第四场 总结
  2. 简单有效又有用的关闭antimalware service executable的方法·备份记录
  3. python基础教程(第三版)学习笔记(十八)
  4. 【报告分享】2021人工智能行业分析研究报告:投资人角度.pdf(附下载链接)...
  5. Exploit WRDS Cloud via Python
  6. 基于CentOS搭建个人Leanote云笔记本
  7. decimal,float和double的区别是什么?
  8. 如果能天天送书,天天爽就好了,再送5本
  9. 去哪儿网支付系统架构演进
  10. 大四实习生的日常(一)