题目描述 Description

在一个荒凉的墓地上

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

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

安顿在他那

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

因为....守墓人懂风水 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.求主墓碑的风水值

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

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

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

为了活命,还是帮他吧

输入输出格式 Input/output

输入格式:

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

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

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

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

输出格式:

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

输入输出样例 Sample input/output

样例测试点#1

输入样例:

5 6

0 0 0 0 0

1 1 5 1

1 1 3 3

2 3

3 1

4 1

5

输出样例:

16

7

说明 description

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

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

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

#include <iostream>
#include <cstdio>
using namespace std; #define ls id<<1
#define rs (id<<1)+1
#define lson l,mid,ls
#define rson mid+1,r,rs const int maxn=200001; struct segment_tree{
int l,r;
long long tag,num;
segment_tree(){tag=num=l=r=0;}
}t[maxn*4]; int n,f;
int num[maxn]; void push_up(int id){
t[id].num=t[ls].num+t[rs].num;
} void push_down(int id){
if(t[id].tag){
t[ls].tag+=t[id].tag;
t[rs].tag+=t[id].tag;
t[ls].num+=t[id].tag*(t[ls].r-t[ls].l+1);
t[rs].num+=t[id].tag*(t[rs].r-t[rs].l+1);
t[id].tag=0;
}
} void build(int l,int r,int id){
t[id].l=l;t[id].r=r;
if(l==r){
t[id].num=num[l];
t[id].tag=0;
return;
}
int mid=(l+r)>>1;
build(lson);
build(rson);
push_up(id);
} long long query(int L,int R,int id){
if(L<=t[id].l && t[id].r<=R)return t[id].num;
push_down(id);
long long res=0;
int mid=(t[id].l+t[id].r)>>1;
if(mid<L)
res=query(L,R,rs);
else
if(mid>=R)
res=query(L,R,ls);
else
res=query(L,mid,ls)+query(mid+1,R,rs);
return res;
} void update(int L,int R,int id,int c){
if(L<=t[id].l && t[id].r<=R){
t[id].num+=(t[id].r-t[id].l+1)*c;
t[id].tag+=c;
return;
}
push_down(id);
if(R>=t[rs].l)update(L,R,rs,c);
if(L<=t[ls].r)update(L,R,ls,c);
push_up(id);
} int main(){
scanf("%d%d",&n,&f);
int i,x,l,r,k;
for(i=1;i<=n;i++)
scanf("%d",&num[i]);
build(1,n,1);
for(i=1;i<=f;i++){
scanf("%d",&x);
if(x==1){
scanf("%d%d%d",&l,&r,&k);
update(l,r,1,k);
}
if(x==2){
scanf("%d",&k);
update(1,1,1,k);
}
if(x==3){
scanf("%d",&k);
update(1,1,1,-k);
}
if(x==4){
scanf("%d%d",&l,&r);
printf("%lld\n",query(l,r,1));
}
if(x==5)printf("%lld\n",query(1,1,1));
}
return 0;
}

洛谷OJ U552 守墓人 线段树模板题的更多相关文章

  1. [AHOI 2009] 维护序列(线段树模板题)

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec  Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小 ...

  2. hdu1823(二维线段树模板题)

    hdu1823 题意 单点更新,求二维区间最值. 分析 二维线段树模板题. 二维线段树实际上就是树套树,即每个结点都要再建一颗线段树,维护对应的信息. 一般一维线段树是切割某一可变区间直到满足所要查询 ...

  3. [POJ2104] 区间第k大数 [区间第k大数,可持久化线段树模板题]

    可持久化线段树模板题. #include <iostream> #include <algorithm> #include <cstdio> #include &l ...

  4. HDU 1698 Just a Hook (线段树模板题-区间求和)

    Just a Hook In the game of DotA, Pudge’s meat hook is actually the most horrible thing for most of t ...

  5. 洛谷P4065 [JXOI2017]颜色(线段树)

    题意 题目链接 Sol 线段树板子题都做不出来,真是越来越菜了.. 根据题目描述,一个合法区间等价于在区间内的颜色没有在区间外出现过. 所以我们可以对于每个右端点,统计最长的左端点在哪里,刚开始以为这 ...

  6. 题解——洛谷P2781 传教(线段树)

    可以说是数据结构学傻了的典型案例了 昨天跳到这题上 然后思考了一下 噫!好!线段树裸题 然后打完板子,发现\(  n \le 10^9 \) 显然线段树直接做不太行 然后这题又只有普及的难度 然后我就 ...

  7. 洛谷P3707 [SDOI2017]相关分析(线段树)

    题目描述 Frank对天文学非常感兴趣,他经常用望远镜看星星,同时记录下它们的信息,比如亮度.颜色等等,进而估算出星星的距离,半径等等. Frank不仅喜欢观测,还喜欢分析观测到的数据.他经常分析两个 ...

  8. UESTC - 1057 秋实大哥与花 线段树模板题

    http://acm.uestc.edu.cn/#/problem/show/1057 题意:给你n个数,q次操作,每次在l,r上加上x并输出此区间的sum 题解:线段树模板, #define _CR ...

  9. 洛谷P3834 可持久化线段树(主席树)模板

    题目:https://www.luogu.org/problemnew/show/P3834 无法忍受了,我要写主席树! 解决区间第 k 大查询问题,可以用主席树,像前缀和一样建立 n 棵前缀区间的权 ...

随机推荐

  1. spin_lock & mutex_lock的区别? 【转】

    转自:http://blog.csdn.net/wilsonboliu/article/details/19190861 本文由该问题引入到内核锁的讨论,归纳如下   为什么需要内核锁? 多核处理器下 ...

  2. Pytorch多进程最佳实践

    预备知识 模型并行( model parallelism ):即把模型拆分放到不同的设备进行训练,分布式系统中的不同机器(GPU/CPU等)负责网络模型的不同部分 —— 例如,神经网络模型的不同网络层 ...

  3. spark和hadoop比较

    来源知乎 计算模型:hadoop-MapReduce,Spark-DAG(有向无环图)评注:经常有人说Spark就是内存版的MapReduce,实际上不是的.Spark使用的DAG计算模型可以有效的减 ...

  4. 开发者常用的 Sublime Text 3 插件

    1.官网下载 Sublime Text 3 (已有安装包的,请忽略) Sublime Text 官网下载地址 : http://www.sublimetext.com/ 2.打开 Sublime Te ...

  5. IPC对象的持续性

    转载:http://book.51cto.com/art/201006/207275.htm <UNIX网络编程:第2版.第2卷,进程间通信>本书全面深入地讲解了各种进程间通信形式,包括消 ...

  6. CVE-2012-4792Microsoft Internet Explorer 释放后使用漏洞

    Microsoft Internet Explorer是微软Windows操作系统中默认捆绑的WEB浏览器. Microsoft Internet Explorer 6至8版本中存在释放后使用漏洞.通 ...

  7. ****jQuery - 设置HTML内容和属性

    设置内容 - text().html() 以及 val() 我们将使用前一章中的三个相同的方法来设置内容: text() - 设置或返回所选元素的文本内容 html() - 设置或返回所选元素的内容( ...

  8. 在Kubernetes上使用Traefik

    本节内容: Traefik介绍 部署测试用的两个服务 Role Based Access Control configuration (Kubernetes 1.6+ only) 部署Traefik ...

  9. 如何查看K8S的网络是否完好

    今天工作中遇到这个问题, 检查从以下几个方面入手. 一,查看各个POD的LOG,如果有错误,则要解决了再继续 二,登陆各个POD之间,互相要能PING通. 三,在物理节点上可以PING通SERVICE ...

  10. 利用Metrics+influxdb+grafana构建监控平台

    https://blog.csdn.net/fishmai/article/details/51817429