线段树【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个节点都是好的. 解:每个区间在最浅的节点处计算答案. 对于每个节点维护从左边过来能有多少区间,从右边过 ...
随机推荐
- try-catch-finally容易犯的错误
测试环境 JDK1.8 1. catch中包含return //有return的时候 输出13423 //无return的时候 输出134234 public class Trycatch { pub ...
- Linux系统源码安装cloud-init
参考:https://cloud.tencent.com/document/product/213/12587使用以下命令下载 cloud-init 源码包 官网下载地址:https://launch ...
- codeforces Registration system
Registration system A new e-mail service "Berlandesk" is going to be opened in Berland in ...
- ocrosoft Contest1316 - 信奥编程之路~~~~~第三关 问题 K: 大整数加法
http://acm.ocrosoft.com/problem.php?cid=1316&pid=10 题目描述 求两个不超过200位的非负整数的和. 输入 有两行,每行是一个不超过200 ...
- [CF845G]Shortest Path Problem?
题目大意:同这道题,只是把最大值变成了最小值 题解:略 卡点:无 C++ Code: #include <cstdio> #define maxn 100010 #define maxm ...
- HDU1536&&POJ2960 S-Nim(SG函数博弈)
S-Nim Time Limit: 2000MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I64u Submit Status ...
- 2015年4月1日 14:36:56 EF 主从表更新
公司封装框架的人把eF封在了工作单元里面,使用了Unitofwork这样的形式, 我用代码生成器生成了基础的单表操作的代码. 这种方式对多表有问题. 暂时只得,一张表一张表地操作, 我采用先用List ...
- [ CodeVS冲杯之路 ] P3143
不充钱,你怎么AC? 题目:http://codevs.cn/problem/3143/ 大水题一道,只要会遍历,这里讲一下思路 先序遍历:先输出,然后左儿子,最后右儿子 中序遍历:先左儿子,再输出 ...
- SQL 整理
批量插入 insert into table select ... union all select... insert into table (...) values (...) , (...) i ...
- python任意编码转utf8或者unicode
# encoding: utf-8 ''' Created on 2015年2月8日 @author: 张鹏程 aprial@163.com @copyright: 版权所有, 尊重劳动成功, 转载与 ...