【洛谷】【前缀和+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表的做法(很简 ...
随机推荐
- 【游记】CCHO TY国初划水记
没想到第一篇游记竟然是化学国初(其实是上次SXACM时候懒得写 DAY0 一下午做了5个小时的校车,服务区水真贵 肝了4个小时模拟题,颠到崩溃. 下榻在距离山大附不远的一个酒店,高三人好多哇,我们年级 ...
- c# XML 有多个重复子节点操作
1,继续添加ebm子节点 public static void CreateXml() { //创XML建对象 XmlDocument doc = new XmlDocument(); //声明根节点 ...
- (一)java并发知识图谱
- Eclipse中导入外部jar包步骤
昨天,学习了Jar包的打包过程,现在打算记录一下,如何在Eclipse中导入外部Jar包. 第一步:在项目中鼠标右键>>New>>点击Folder. 第二步:在弹出窗口将Fol ...
- SpringBoot启动加载类ApplicationRunner
SpringBoot启动加载类ApplicationRunner 有时希望项目在启动的时候加载一些系统参数,就要用到ApplicationRunner ApplicationRunner是一个接口,我 ...
- ApplicationListener用法
ApplicationListener是spring提供的接口,作用是在web服务器启动时去加载某些程序. 用法: 1.实现ApplicationListener接口,并重写onApplication ...
- Spring Data Solr —— 快速入门
Solr是基于Lucene(全文检索引擎)开发,它是一个独立系统,运行在Tomcat或Jetty(solr6以上集成了jetty,无需再部署到servlet容器上),但其原生中文的分词词功能不行,需要 ...
- 5月8日——iOS中的3D Touch效果
需要在manifest.json文件中进行配置 需要执行的js代码为: 最终操作效果为 本篇文章主要采用了HTML5+ 中的 launcher属性 具体可参照 http://www.html5plu ...
- 排序算法(7)--exchang Sorting--交换排序[2]--Quick Sort--快速排序
1.基本思想 从待排序列中选取一元素作为轴值(也叫主元). 将序列中的剩余元素以该轴值为基准,分为左右两部分.左部分元素不大于轴值,右部分元素不小于轴值.轴值最终位于两部分的分割处. 对左右两部分重复 ...
- MySQL两种存储引擎: MyISAM和InnoDB
MySQL两种存储引擎: MyISAM和InnoDB 简单总结 MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Me ...