线段树【p2629】 好消息,坏消息
顾z
你没有发现两个字里的blog都不一样嘛 qwq
题目描述-->p2629 好消息,坏消息
历程
刚开始看到这个题,发现是需要维护区间和,满心欢喜敲了一通线段树,简单debug之后交上去 \(45pts\)?
改代码的时候开始考虑这样做的正确性.
维护区间和,前后两个的区间和加起来一定等于整个区间的区间和,那我和直接求和有什么区别?
再次读题
发现必须要求每一个时刻老板的怒气值都\(\geq 0\)才行.
xjb分析
既然维护区间和行不通,考虑改变线段树所维护的东西.
考虑维护些什么?
我们需要维护一个区间的最小值,才能判断是否满足\(\geq 0\)
而某一个位置的值,受前面位置的值的影响.
因此我们想到了前缀和.
即我们可以维护前缀和的最小值.
解决85%
既然想到了维护前缀和,那这样就很简单了.
根据题目所叙述的,我们需要从 \(k,k_1,k_2 \dots n,1,2 \dots k-1\)累加
所以我们要先判断后缀的最小值是否\(\leq 0\)。
显然,我们的前缀和的计算为\(sum_i=\sum_{j=1}^{i}a_i\)
后缀部分\(\sum_{i=k}^{n}a_i\)的计算要减去\(sum_{k-1}\)
又因为题目要求的计算顺序,我们需要考虑后缀和与前缀最小值的和是否\(\geq 0\)
所以很容易写出这部分的代码
for(R int i=2;i<=n;i++)
{
if(query(1,1,n,i,n)-sum[i-1]<0)continue;
if(sum[n]-sum[i-1]+query(1,1,n,1,i-1)>=0)
ans++;
}
看到上面的\(85\)%了没?
如果只单纯判断这些情况的话只能get到\(85pts\)
考虑被遗忘的情况
检查一番,我们发现题目中这一句话
uim必须按照时间的发生顺序逐条将消息告知给老板
突然醒悟
我们还可以从\(1\)到\(n\)告诉老板!
再加上判断是否整个区间的前缀最小值\(\leq 0\)即可.
综上,我们的问题就得以解决了!
---------------------代码---------------------
#include<bits/stdc++.h>
#define R register
#define N 1000008
#define ls o<<1
#define rs o<<1|1
using namespace std;
int tr[N<<2],ans,n,sum[N];
inline void up(int o){tr[o]=min(tr[ls],tr[rs]);return;};
void build(int o,int l,int r)
{
if(l==r)
{
tr[o]=sum[l];
return;
}
int mid=(l+r)>>1;
build(ls,l,mid);
build(rs,mid+1,r);
up(o);
}
int query(int o,int l,int r,int x,int y)
{
if(x<=l and y>=r)return tr[o];
int mid=(l+r)>>1,res=2147483647;
if(x<=mid)res=min(res,query(ls,l,mid,x,y));
if(y>mid)res=min(res,query(rs,mid+1,r,x,y));
return res;
}
int main()
{
scanf("%d",&n);
for(R int i=1,x;i<=n;i++)scanf("%d",&x),sum[i]=sum[i-1]+x;
build(1,1,n);
for(R int i=2;i<=n;i++)
{
if(query(1,1,n,i,n)-sum[i-1]<0)continue;
if(sum[n]-sum[i-1]+query(1,1,n,1,i-1)>=0)
ans++;
}
printf("%d",ans+(tr[1]>=0));
}
线段树【p2629】 好消息,坏消息的更多相关文章
- 【洛谷】【前缀和+st表】P2629 好消息,坏消息
[题目描述:] uim在公司里面当秘书,现在有n条消息要告知老板.每条消息有一个好坏度,这会影响老板的心情.告知完一条消息后,老板的心情等于之前老板的心情加上这条消息的好坏度.最开始老板的心情是0,一 ...
- 单调队列练习题解(切蛋糕&好消息,坏消息)
单调队列的练习题解 前言: 在上一篇学习记录中,单调队列给出了几道练习题,因为这两道题的算法以及思路相差无几(几乎可以算是双倍经验quq),所以就在这里集中写一下相关的题解 前置知识: 见:队列专题( ...
- 【BZOJ3207】花神的嘲讽计划I 可持久化线段树/莫队
看到题目就可以想到hash 然后很自然的联想到可持久化权值线段树 WA:base取了偶数 这道题还可以用莫队做,比线段树快一些 可持久化线段树: #include<bits/stdc++.h&g ...
- BZOJ 3207: 花神的嘲讽计划Ⅰ( hash + 可持久化线段树 )
O(NK)暴力搞出所有子串的哈希值, 然后就对哈希值离散化建权值线段树, 就是主席树的经典做法了.总时间复杂度O(NK+(N+Q)logN) ----------------------------- ...
- 线段树(hdu 2795)
Billboard Time Limit: 20000/8000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- [转载]完全版线段树 by notonlysuccess大牛
原文出处:http://www.notonlysuccess.com/ (好像现在这个博客已经挂掉了,在网上找到的全部都是转载) 今天在清北学堂听课,听到了一些很令人吃惊的消息.至于这消息具体是啥,等 ...
- BZOJ4946[Noi2017]蔬菜——线段树+堆+模拟费用流
题目链接: [Noi2017]蔬菜 题目大意:有$n$种蔬菜,每种蔬菜有$c_{i}$个,每种蔬菜每天有$x_{i}$个单位会坏掉(准确来说每天每种蔬菜坏掉的量是$x_{i}-$当天这种蔬菜卖出量), ...
- LOJ#510 北校门外的回忆(找性质+倍增+线段树)
这题一场模拟赛我们出了弱化版(n<=1e6),抄题面给的程序能拿到71分的好成绩 其实后面的29分是加了几个1e9的数据卡人 这糟老头子真是坏得很 正解我们机房看了三天 在这里感谢这篇题解的作者 ...
- 洛谷P5111 zhtobu3232的线段树
题意:给定线段树,上面若干个节点坏了,求能表示出多少区间. 区间能被表示出当且仅当拆出来的log个节点都是好的. 解:每个区间在最浅的节点处计算答案. 对于每个节点维护从左边过来能有多少区间,从右边过 ...
随机推荐
- 孤荷凌寒自学python第十天序列之字符串的常用方法
孤荷凌寒自学python第十天序列之字符串的常用方法 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) Python的字符串操作方法非常丰富,原生支持字符串的多种操作: 1 查找子字符串 str ...
- diskimage-builder-command
yum -y install python-virtualenv.noarch virtualenv ~/dib-virtualenv . ~/dib-virtualenv/bin/activate ...
- maven中mapper.xml不发布的问题
在自定义的包中定义了mapper.xml然后利用mybatis的扫描包形式来动态创建mapper 开启工程报错: 说无效的绑定 原因: 发布的war中,工程包中的mapper根本就没有出现在class ...
- Android记事本06
昨天: activity的生命周期 今天: activity横竖屏切换的生命周期 遇到的问题: 为了匹配ADK,下载了更旧的版本SDK,布局文件仍然无法显示.
- ocrosoft Contest1316 - 信奥编程之路~~~~~第三关 问题 E: IQ(iq)
http://acm.ocrosoft.com/problem.php?cid=1316&pid=4 题目描述 根据世界某权威学会的一项调查,学信息学的学生IQ非常高.举个最好的例子,如果我们 ...
- poj 1932 XYZZY (最短路径)
XYZZY Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 3105 Accepted: 887 Description ...
- 关于flink的时间处理不正确的现象复现&原因分析
跟朋友聊天,说输出的时间不对,之前测试没关注到这个,然后就在processing模式下看了下,发现时间确实不正确 然后就debug,看问题在哪,最终分析出了原因,记录如下: 最下面给出了复现方案 ...
- BZOJ 2453 维护队列 | 分块
题目: http://www.lydsy.com/JudgeOnline/problem.php?id=2453 题解: 考虑维护每个位置的颜色上一次出现在哪里,计为pre[i],在询问l到r的时候, ...
- JAVA输出最大值和最小值
public class MaxMin{ public static void main(String[] args) { int[] arr = new int[6]; Scanner input ...
- 2.1 Python3.5安装以及爬虫需要的环境配置
之所以选用Python,是因为对于网络爬虫来说,Python是最好上手的一种语言.本文讲述的安装配置都是基于Windows的环境. 另外我想说的是,文中用到的下载链接尽量官方网站上的下载链接,这是我比 ...