题目链接

首先想到的就是暴力前缀和,枚举一个区间每次统计前缀和,前缀和的某一个值为负数时就退出

如何枚举区间?

比如样例:

\(4\)

\(-3\ 5\ 1\ 2\)

可以使用一种断环为链的操作, 让其变成

\(-3\ 5\ 1\ 2\ -3\ 5\ 1\)

就有下面4个区间:

\(-3\ 5\ 1\ 2\)

\(5\ 1\ 2\ -3\)

\(1\ 2\ -3\ 5\)

\(2\ -3\ 5\ 1\)

容易写出代码

但很显然,对于\(10^{6}\)的数据会超时

将上面4个区间前缀和

\(-3\ 2\ 3\ 5\)

\(5\ 6\ 8\ 5\)

\(1\ 3\ 0\ 5\)

\(2\ -1\ 4\ 5\)

可以发现,只要区间最小值\(>=0\),那么区间一定合法

就可以用单调队列优化时间复杂度

都知道,单调队列维护的是区间最小或最大值

刚好可以用来维护这道题长度为\(n\)的区间最小值

还有就是\(long\ long\)

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e6 + 5;
#define int long long
int n, a[MAXN], sum[MAXN], ans;
deque <int> dq;
signed main() {
scanf("%lld", &n);
for (int i = 1; i <= n; ++i) scanf("%lld", a + i);
for (int i = n + 1; i <= 2 * n - 1; ++i) a[i] = a[i - n]; //断环为链
for (int i = 1; i <= 2 * n - 1; ++i) sum[i] = sum[i - 1] + a[i]; //前缀和
for (int i = 1; i <= 2 * n - 1; ++i) {
if (i > n) { //区间长度达到n了
if (sum[dq.front()] - sum[i - n] >= 0) ++ans;
if (dq.front() == i - n) dq.pop_front(); //如果是必须出队的那一个,就出队,否则就是后面的数,不用出队,因为还有机会
}
while (!dq.empty() && sum[i] <= sum[dq.back()]) dq.pop_back(); //单调队列的做法
dq.push_back(i); //维护最小值的下标,才能统计区间和
}
if (sum[dq.front()] - sum[n] >= 0) ++ans; //最后还要统计一次
printf("%lld\n", ans);
return 0;
}

这题可以复习单调队列

洛谷 P2629 好消息,坏消息(单调队列)的更多相关文章

  1. 【BZOJ】4721: [Noip2016]蚯蚓 / 【洛谷】P2827 蚯蚓(单调队列)

    Description 本题中,我们将用符号[c]表示对c向下取整,例如:[3.0」= [3.1」=[3.9」=3.蛐蛐国最近蚯蚓成灾了!隔壁跳 蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮 ...

  2. 洛谷 P2629 好消息,坏消息

    题目描述 uim在公司里面当秘书,现在有n条消息要告知老板.每条消息有一个好坏度,这会影响老板的心情.告知完一条消息后,老板的心情等于之前老板的心情加上这条消息的好坏度.最开始老板的心情是0,一旦老板 ...

  3. 洛谷 P2629 好消息,坏消息 题解

    暴力算法的时间复杂度是O(n^2),考虑优化: 先导入一种思想--断环为链.说通俗点就是在原数组后面再接上下标为1--(n - 1)的元素: 以样例为例:-3 5 1 2:我们将其断环为链后可以得到这 ...

  4. 洛谷.2219.[HAOI2007]修筑绿化带(单调队列)

    题目链接 洛谷 COGS.24 对于大的矩阵可以枚举:对于小的矩阵,需要在满足条件的区域求一个矩形和的最小值 预处理S2[i][j]表示以(i,j)为右下角的C\(*\)D的矩阵和, 然后对于求矩形区 ...

  5. 【洛谷P1886】滑动窗口——单调队列

    没想到啊没想到,时隔两个月,我单调队列又懵了…… 调了一个小时,最后错在快读,啊!!!!(不过洛谷讨论真好啊,感谢大佬!) 考前就不推新东西了,好好写写那些学过的东西 题目点这里(我就不粘了自己点一下 ...

  6. 洛谷 P3580 - [POI2014]ZAL-Freight(单调队列优化 dp)

    洛谷题面传送门 考虑一个平凡的 DP:我们设 \(dp_i\) 表示前 \(i\) 辆车一来一回所需的最小时间. 注意到我们每次肯定会让某一段连续的火车一趟过去又一趟回来,故转移可以枚举上一段结束位置 ...

  7. 洛谷P2698 花盆Flowerpot【单调队列】

    题目描述 Farmer John has been having trouble making his plants grow, and needs your help to water them p ...

  8. 2018.09.26洛谷P3957 跳房子(二分+单调队列优化dp)

    传送门 表示去年考普及组的时候失了智,现在看来并不是很难啊. 直接二分答案然后单调队列优化dp检验就行了. 注意入队和出队的条件. 代码: #include<bits/stdc++.h> ...

  9. 洛谷P3975 跳房子 [DP,单调队列优化,二分答案]

    题目传送门 跳房子 题目描述 跳房子,也叫跳飞机,是一种世界性的儿童游戏,也是中国民间传统的体育游戏之一. 跳房子的游戏规则如下: 在地面上确定一个起点,然后在起点右侧画 n 个格子,这些格子都在同一 ...

  10. 洛谷 P3957 跳房子 —— 二分答案+单调队列优化DP

    题目:https://www.luogu.org/problemnew/show/P3957 先二分一个 g,然后判断: 由于转移的范围是一个区间,也就是滑动窗口,所以单调队列优化: 可以先令队尾为 ...

随机推荐

  1. 上下文管理器 context managet

    定义:实现了上下文管理协议的对象,主要用于保存和恢复各种全局状态,关闭文件等,它本身就是一种装饰器. with语句 with语句就是为支持上下文管理器而存在的

  2. Day11.2:标签的使用

    标签的使用 当我们在嵌套语句中,例如当我们在for的嵌套循环语句中,想要终止或重新开始当前循环以外的循环的时候,单独仅靠break和continue和还不够,需要在我们想要作用的循环语句处加上一个标签 ...

  3. C#程序自启动

    在窗体加载事件里面加入下述代码: //设置开机自启动 RegistryKey registryKey = Registry.CurrentUser.OpenSubKey ("SOFTWARE ...

  4. Perl exists 函数和defined函数的区别

    Perl exists 函数和defined函数的区别

  5. Go语言核心36讲50

    作为拾遗的部分,今天我们来讲讲与Go程序性能分析有关的基础知识. Go语言为程序开发者们提供了丰富的性能分析API,和非常好用的标准工具.这些API主要存在于: runtime/pprof: net/ ...

  6. Swing常用窗体

    Swing常用窗体 Swing 主要具有以下特点: ( 1 )轻量级组件. ( 2 )可插入外观组件. 窗体作为Swing的应用程序中组件的承载体,处于非常重要的地位.Swing中常用的窗体包括JFr ...

  7. 使用Python实现多线程、多进程、异步IO的socket通信

    多线程实现socket通信服务器端代码 import socket import threading class MyServer(object): def __init__(self): # 初始化 ...

  8. 【Java EE】Day03 DQL、约束、数据库设计、范式、备份和还原

    〇.总结 1.DQL 聚合函数有空值需要使用ifnull函数 where不能使用聚合函数 分页开始索引的计算,及mysql和oracle的方言 2.约束 删除唯一约束DROP INDEX 列名; 3. ...

  9. 【Scala】上:学习文档、文章、思维导图

    〇.可查阅资料 1.文档 英文文档:https://tool.oschina.net/apidocs/apidoc?api=scala-docs-2.9.2 与java:https://docs.sc ...

  10. 【Impala】概念、原理、内外部shell、建库建表、分区、查询、自定义函数、存储压缩

    一.基本概念 1.介绍 对HDFS.Hbase数据的高性能.低延迟的交互式SQL查询功能 2.优缺点 优点:基于内存运算,无需写入磁盘,无需转化为MR,支持Data Locality调度(数据和计算在 ...