【洛谷】【前缀和+st表】P2629 好消息,坏消息
【题目描述:】
uim在公司里面当秘书,现在有n条消息要告知老板。每条消息有一个好坏度,这会影响老板的心情。告知完一条消息后,老板的心情等于之前老板的心情加上这条消息的好坏度。最开始老板的心情是0,一旦老板心情到了0以下就会勃然大怒,炒了uim的鱿鱼。
uim为了不被炒,知道了了这些消息(已经按时间的发生顺序进行了排列)的好坏度,希望研究如何不让老板发怒。
uim必须按照时间的发生顺序逐条将消息告知给老板。不过uim可以使用一种叫“倒叙”的手法,例如有n条消息,小a可以从k,k+1,k+2...n,1,2...k-1这种顺序通报。
他希望知道,有多少个k,从k开始通报到n然后从1通报到k-1可以让老板不发怒。
【输入格式:】
第一行一个整数n(1 <= n <= 10^6),表示有n个消息。
第二行n个整数,按时间顺序给出第i条消息的好坏度Ai(-1000 <= Ai <= 1000)
【输出格式:】
一行一个整数,表示可行的方案个数。
在旁边wzx大(巨)佬的指点下切掉了这道题
[算法分析:]
对于要判断区间\([l,\ r]\)内在某一时刻的和是否为负值,只需要看从\([l,\ r]\)的前缀和序列的值是否为负.
(这道题是要求对于一个点\(i\),判断\([i,\ n]\)和\([1,\ i-1]\)中某一时刻的前缀和是否存在负值)
那怎样快速地求出这个前缀和序列并判断是否有负值呢?
枚举的方法显然并不高效,反而和直接模拟的复杂度一样了,抛掉
判断是否有负值,可以找到一个标准,只要这个标准非负,那整个序列也就没有负值了
显然的,标准应选为\([l,\ r]\)的前缀和序列的最小值,便可以使用st表或者线段树来快速查询.
那又应该如何求出\([l,\ r]\)的前缀和序列呢?每次求一遍?显然复杂度会降到约为\(O(n^3)\)
对于一个序列\(a\),\([1,\ r]\)的前缀和序列的最小值再减去\([1,\ l - 1]\)的元素和,即为\([l,\ r]\)的前缀和序列最小值
即:$$min{\sum_{j = l}^{r}\sum_{i = l}^{j} a_i} = min{\sum_{j = 1}^{r}\sum_{i = 1}^{j} a_i} - \sum_{i = 1}^{l - 1}a_i$$
所以当我们根据序列\(a\)求出\([l,\ r]\)的前缀和序列sum时,使用st表维护这个序列sum的最小值,
就可以做到\(O(1)\)查询\(min\{\sum_{j = l}^{r}\sum_{i = l}^{j} a_i\}\)
预处理复杂度\(O(nlog_2n)\),算法主体的时间复杂度为\(O(n)\)
而使用线段树也可以维护最小值,根据前缀和序列建树,预处理\(O(n)\),算法主体复杂度为\(O(nlog_2n)\),和st表差不多。
(但是实测好像st表跑的慢一些)
也可以使用单调队列来求最值,复杂度应该是\(O(n)\),比st表和线段树都要快,但是我不会QwQ
\([Code:]\)
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
const int MAXN = 1e6 + 1;
const int K = 20 + 1;
int n;
int a[MAXN], sum[MAXN];
int st[MAXN][K], Log2[MAXN];
inline int read() {
int x=0, f=1; char ch=getchar();
while(ch<'0' || ch>'9') {
if(ch == '-') f = -1;
ch = getchar();
}
while(ch>='0' && ch<='9')
x=(x<<3)+(x<<1)+ch-48, ch=getchar();
return x * f;
}
inline int Query(int l, int r) {
int x = Log2[r - l + 1];
return min(st[l][x], st[r-(1<<x)+1][x]);
}
int main() {
n = read();
for(int i=1; i<=n; ++i) a[i] = read();
for(int i=1; i<=n; ++i)
st[i][0] = sum[i] = sum[i-1] + a[i];
for(int j=1; j<=K; ++j)
for(int i=1; i+(1<<j)-1<=n; ++i)
st[i][j] = min(st[i][j-1], st[i+(1<<(j-1))][j-1]);
for(int i=0; (1<<i)<=n; ++i) Log2[1<<i] = i;
for(int i=1; i<=n; ++i)
if(!Log2[i]) Log2[i] = Log2[i-1];
int ans = 0;
for(int i=1; i<=n; ++i) {
if(Query(i, n)-sum[i-1] < 0) continue;
if(Query(1, i-1) + sum[n] - sum[i-1] >= 0) ++ans;
}
printf("%d\n", ans);
}
【洛谷】【前缀和+st表】P2629 好消息,坏消息的更多相关文章
- 【洛谷】【st表+模拟】P1311 选择客栈
[题目描述:] 丽江河边有n 家很有特色的客栈,客栈按照其位置顺序从 1 到n 编号.每家客栈都按照某一种色调进行装饰(总共 k 种,用整数 0 ~ k-1 表示),且每家客栈都设有一家咖啡店,每家咖 ...
- 线段树【p2629】 好消息,坏消息
顾z 你没有发现两个字里的blog都不一样嘛 qwq 题目描述-->p2629 好消息,坏消息 历程 刚开始看到这个题,发现是需要维护区间和,满心欢喜敲了一通线段树,简单debug之后交上去 \ ...
- 【题解】洛谷 P1014 【Cantor表】
1. 我们先引入三角形数的概念: >定数目的点或圆在等距离的排列下可以形成一个等边三角形,这样的数被称为三角形数. >古希腊著名科学家毕达哥拉斯把数1,3,6,10,15,21……这些数量 ...
- 洛谷 - P2181 - 对角线 - 打表 - 组合数学
https://www.luogu.org/problemnew/show/P2181 对于某条对角线,除去从两端出发的对角线,其他的都与它有1个交点. 每个点有(n-3)条对角线,每条对角线和其余C ...
- 洛谷 P1816 忠诚 ST函数
题目描述 老管家是一个聪明能干的人.他为财主工作了整整10年,财主为了让自已账目更加清楚.要求管家每天记k次账,由于管家聪明能干,因而管家总是让财主十分满意.但是由于一些人的挑拨,财主还是对管家产生了 ...
- 【洛谷3865】 【模板】ST表(猫树)
传送门 洛谷 Solution 实测跑的比ST表快!!! 这个东西也是\(O(1)\)的,不会可以看我上一篇Blog 代码实现 代码戳这里
- 【洛谷】P2880 [USACO07JAN]平衡的阵容Balanced Lineup(st表)
题目背景 题目描述: 每天,农夫 John 的N(1 <= N <= 50,000)头牛总是按同一序列排队. 有一天, John 决定让一些牛们玩一场飞盘比赛. 他准备找一群在对列中为置连 ...
- 洛谷P4501/loj#2529 [ZJOI2018]胖(ST表+二分)
题面 传送门(loj) 传送门(洛谷) 题解 我们对于每一个与宫殿相连的点,分别计算它会作为多少个点的最短路的起点 若该点为\(u\),对于某个点\(p\)来说,如果\(d=|p-u|\),且在\([ ...
- 【洛谷P1816】忠诚——ST表做法
看了两个小时RMQ并位运算,对二进制勉勉强强有了个初步了解,不能说精通(可能今年CSP前都做不到精通),但是记熟板子做做题还是没有问题的 以下是正式题解,相信你看过了题目,我介绍的是ST表的做法(很简 ...
随机推荐
- 线程基础的一些理解(一)(java)
一.多线程的基本概念 线程是指进程中的一个执行场景,也就是执行流程,所以我们首先要聊一聊进程,以及进程和线程的关系 1.什么是进程? 一个进程对应一个应用程序,就像我们在windows系统中启动Wo ...
- WebServer搭建过程
第一步,新建Web网站项目 第二步: 右击项目解决方案,选择添加新建项 选择Web服务项 第三步,在asmx方法中将Hello World注释掉,然后编写自己的方法,这里根据项目的不同可以做不同的处理 ...
- django-templates过滤器
常用内置过滤器: 过滤器会更改量或便签参数的值: title过滤器: {{ django|title }} 在下列context中 {'django': 'the web framework for ...
- 设计模式(12)--Proxy(代理模式)--结构型
作者QQ:1095737364 QQ群:123300273 欢迎加入! 1.模式定义: 代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. ...
- h5向上翻页图标晃动动画,css固定h5向上翻页图标在页面上
//html结构<div class='upImg'><div> //css .upImg { background-image: url(../images/01.png); ...
- SQLServer SQL连接查询深度探险(摘录
SQL连接查询深度探险[摘录] 测试环境: Windows XP Profession MySQL 5.0.45 Oracle 9i DB2 UDB 9.1 测试的SQL脚本如下:此脚本适合MySQL ...
- MVC与单元测试实践之健身网站(二)-管理员模块
开始动手做这个项目时,发现无法做到完全的先设计.再编码,于是决定分模块进行,从管理员模块开始设计.编码,而且接口就已经改了好几次了. 管理员模块涉及的功能有登录和后台对管理员的维护,其中也涉及前端的开 ...
- Android--播放Gif的取巧办法
由于做的项目,要有个动画的等待效果,第一时间想到的就是Gif(懒,省事),但是试了好多据说能播放Gif的控件,也写过,但是放到魅族手机上就是不能播放,所有就想了个招,既然Gif能在浏览器上播放,那an ...
- [Ubuntu] 14.04 外接显示器分辨率调整
最近按照提示更新了一下系统,安装了100多M的更新包,结果系统又读不出外接显示器的信息了,开机显示vga-1:probed a monitor but no|invalid edid,我也不懂. 后来 ...
- Linux —— Vi 命令介绍
简介 vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器. 这里只是简单地介绍一下它的用法和一小部分指令. 由于对Unix及Linux系统的任何版本,vi编辑 ...