P2357 守墓人(树状数组/线段树)
题目描述
在一个荒凉的墓地上
有一个令人尊敬的守墓人, 他看守的墓地从来
没有被盗过, 所以人们很放心的把自己的先人的墓
安顿在他那
守墓人能看好这片墓地是必然而不是偶然.....
因为....守墓人懂风水 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 守墓人(树状数组/线段树)相关推荐
- D-query SPOJ - DQUERY(求区间不同数的个数)(树状数组||线段树+离散)(主席树+在线)
English Vietnamese Given a sequence of n numbers a1, a2, -, an and a number of d-queries. A d-query ...
- 差分+树状数组 线段树【P2357】 守墓人
题目描述-->p2357 守墓人 敲了一遍线段树,水过. 树状数组分析 主要思路: 差分 简单介绍一下差分(详细概念太麻烦,看下面. 给定一个数组 7 8 6 5 1 8 18 20 35 // ...
- HDU 1556 前缀和 树状数组 线段树
解法一: a[i]表示以 i作为起点,对 i-n的气球全部上色的次数 对(start,end)区间上色 ++a[start] --a[end+1]抵消掉 end+1-n的部分 问题转换为求 a的前缀 ...
- jzoj3854-分组【树状数组,线段树】
正题 题目链接:https://jzoj.net/senior/#contest/show/2990/2 题目大意 一个小队满足要求 队长的地位最高 所有队员和队长的年龄差不超过kkk 给出nnn个人 ...
- 模板三连击:树状数组+线段树+主席树
没事儿干,复习模板...... 1.树状数组 本来不想写这个的,但是反正就几分钟就打完了,所以就写了,水AC数. 洛谷 P3374 [模板]树状数组 1 1 #include<cstdio> ...
- 51nod 1680区间求和 (dp+树状数组/线段树)
不妨考虑已知一个区间[l,r]的k=1.k=2....k=r-l+1这些数的答案ans(只是这一个区间,不包含子区间) 那么如果加入一个新的数字a[i](i = r+1) 则新区间[l, i]的答案为 ...
- CCF201709-5 除法(100分)【树状数组+线段树】
试题编号: 201709-5 试题名称: 除法 时间限制: 10.0s 内存限制: 256.0MB 问题描述: 问题描述 小葱喜欢除法,所以他给了你N个数a1, a2, ⋯, aN,并且希望你执行M次 ...
- POJ2182 HDU2711 Lost Cows【树状数组+线段树】
Lost Cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 17113 Accepted: 10664 Descripti ...
- [CSP-S模拟测试]:影魔(树状数组+线段树合并)
题目背景 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万. 千百年来,他收集了各式各样的灵魂,包括诗人.牧师.帝王.乞丐.奴隶.罪人,当然,还有英雄. 每一个灵魂,都有着 ...
最新文章
- 点云python-pcl
- Matlab与数据结构 -- 搜索向量或矩阵中非零元素的位置
- linux进程khungtaskd,Linux查看进程的所有信息的方法示例
- 格式化输出中的%s和%S的区别
- 什么是nginx负载均衡高可用
- 智能小车37:异常在ARM、JAVA、硬件里的实现
- 对任意长度字符串,删除其中的任意的N(N=0)个字符
- 利用memoize缓存到Redis出现多个参数同一个结果
- U盘无法格式化,变成8M,RAW格式,0字节的U盘修复教程
- 双人贪吃蛇java 代码_java 双人贪吃蛇
- Music Radio Beta-Perview 1.0.0.0.(做了一个听音乐电台的东东.:)
- MobaXterm快捷输入
- eclipse常用快捷键和设置
- 正交解调 matlab,13.1.1 正交调制解调
- Android开发常见面试
- APP开发学习思路指导
- Oracle 判断正负数函数 sign
- 【数字信号】基于matlab GUI DTMF电话模拟系统(频谱图+时域图+语谱图)【含Matlab源码 2092期】
- Android利用贝塞尔曲线实现翻书效果(适配AndroidX)
- Win10右键清空剪贴板
热门文章
- 2017暑假第二阶段第四场 总结
- 简单有效又有用的关闭antimalware service executable的方法·备份记录
- python基础教程(第三版)学习笔记(十八)
- 【报告分享】2021人工智能行业分析研究报告:投资人角度.pdf(附下载链接)...
- Exploit WRDS Cloud via Python
- 基于CentOS搭建个人Leanote云笔记本
- decimal,float和double的区别是什么?
- 如果能天天送书,天天爽就好了,再送5本
- 去哪儿网支付系统架构演进
- 大四实习生的日常(一)