link

贪心做法。


本题贪心做法的实质就是用整数尽量多地抵消该整数后面的负数。

如果正着做,没有办法考虑全该数后面的所有负数,所以倒着做。

例如当前遍历到了 \(50\),此时序列如下:

\[\dots,50,-50,-10,-20
\]

易得我们 \(50\) 应该抵消的是 \(-10,-20\),而不是前面的 \(-50\),因为我们要使删除的数越少越好。

但是剩下的 \(50 - 10 - 20 = 20\) 也不能空着,抵消一部分的剩下的 \(-50\) 即可。

最终得到:

\[\dots, -30
\]

发现上述操作可以用堆来维护,具体维护方法见代码。


  • 时间复杂度:\(\mathcal O ((n + m) \log _ n)\),瓶颈在于堆和二分。
  • 空间复杂度:略。

代码:

// 加强版:n,m <= 1000000 代码
#include <bits/stdc++.h>
#define int long long
#define pii pair<int, int>
using namespace std; const int N = 1e6 + 5; int n, m, a[N], b[N], tot; signed main() {
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
priority_queue<int> q;
for (int i = n; i >= 1; i--) {
if (a[i] < 0) {
q.push(a[i]);
} else {
while (q.size() && a[i] >= 0) {
a[i] += q.top();
q.pop();
}
if (a[i] < 0) {
q.push(a[i]);
}
}
}
while (q.size()) {
b[++tot] = -q.top();
q.pop();
}
for (int i = 1; i <= tot; i++) {
b[i] += b[i - 1];
}
for (int i = 1; i <= m; i++) {
int x;
cin >> x;
if (x >= b[tot]) {
cout << "0\n";
continue;
}
int t = upper_bound(b + 1, b + tot, x) - b - 1;
cout << tot - t << "\n";
}
return 0;
}

题解:CF727F Polycarp's problems的更多相关文章

  1. CF727F [Polycarp's problems] & [EX_Polycarp's problems]

    原题题意 给出长度为n的有序数组,m次询问,每次给出一个正整数x.你要删除数组中最少的元素,使得数组中的前缀和+x都为非负整数.允许离线,n≤750,m≤200,000. 原题思路 首先注意到,x能成 ...

  2. Polycarp's problems

    Polycarp's problems time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  3. codeforces 727F. Polycarp's problems

    题目链接:http://codeforces.com/contest/727/problem/F 题目大意:有n个问题,每个问题有一个价值ai,一开始的心情值为q,每当读到一个问题时,心情值将会加上该 ...

  4. Codeforces 727 F. Polycarp's problems

    Description 有一个长度为 \(n\) 有正负权值的序列,你一开始有一个值,每次到一个权值就加上,最少需要删掉多少数值才能到序列末尾.\(n \leqslant 750,m \leqslan ...

  5. 2019年7月22日 - LeetCode0004

    https://leetcode-cn.com/problems/median-of-two-sorted-arrays/submissions/ 我的解法: 我看到了那个log的要求,也第一时间想到 ...

  6. 2019年7月20日 - LeetCode0003

    https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/submissions/ 我的解法: c ...

  7. 【LeetCode 10】正则表达式匹配

    题目链接 [题解] 看到这个题解 写的代码. 就是加个备忘录法.优化一下暴力的做法. 匹配的时候如果遇到号的话,就两种可能.不再考虑它前面一个字符了. 跳过这个或者.或者继续用前面那个字符匹配. 即d ...

  8. 素数筛 : Eratosthenes 筛法, 线性筛法

    这是两种简单的素数筛法, 好不容易理解了以后写篇博客加深下记忆 首先, 这两种算法用于解决的问题是 : 求小于n的所有素数 ( 个数 ) 比如 这道题 在不了解这两个素数筛算法的同学, 可能会这么写一 ...

  9. 15 道超经典大厂 Java 面试题!重中之重

    从超高频的后端面试题出发,指明学习方向 大家好,我是鱼皮. 还记得我的老弟小阿巴么?他目前正值大一暑假,在家自学编程(刷短视频)中. 他整个大一期间基本都在学习前端.后来,我带他写了一次后端,结果就崩 ...

  10. LeetCode题目答案及理解汇总(持续更新)

    面试算法题 dfs相关 全排列 #include<bits/stdc++.h> using namespace std; const int N = 10; //用一个path数组来存储每 ...

随机推荐

  1. 3.8 Linux显示当前工作路径(pwd命令)

    由于 Linux 文件系统中有许多目录,当用户执行一条 Linux 命令又没有指定该命令或参数所在的目录时,Linux 系统就会首先在当前目录(目前的工作目录)搜寻这个命令或它的参数.因此,用户在执行 ...

  2. glibc 内存分配与释放机制详解

    作者:来自 vivo 互联网存储团队- Wang Yuzhi 本文以一次线上故障为基础介绍了使用 glibc 进行内存管理可能碰到问题,进而对库中内存分配与释放机制进行分析,最后提供了相应问题的解决方 ...

  3. 做AI运动小程序有哪些解决方案,如何进行选型?

    引言:随着深度学习技术的发展进步,已经不再依赖强大的GPU算力,便可实现AI推理了,让AI技术渗透到了电脑.手机.智能设备等各类设备.体育.健身行业也不例外,阿里体育等IT大厂,推出的乐动力.天天跳绳 ...

  4. 2025年前端面试准备css篇

    1.css 盒子模型 css包含了内容(content) ,内边距(padding),边框(border),外边距(margin) 等因素. css 标准盒子模型宽包括:margin+border+p ...

  5. Python:pygame游戏编程之旅二(自由移动的小球)

    本节实现一个在窗口中自由运动的小球程序,做了详细注释,不多做解释了. 代码: # -*- coding:utf-8 -*- import sys import pygame from pygame.l ...

  6. Tornado框架之异步与WebSocket(五)

    知识点 理解同步与异步执行过程 理解异步代码的回调写法与yield写法 Tornado异步 异步Web客户端AsyncHTTPClient tornado.web.asynchronous torna ...

  7. 关于PageHiOffice插件在win10登录桌面前提示的解决

    win10笔记本开机,在未登录桌面时,总是有PageHiOffice插件已过期的提示. 使用process monitor 的Enable Boot Logging功能进行监视,重启后,再次打开pro ...

  8. Python 学习记录(1)

    前言 简单说明: 简单情况:主要记录学习Python的简单情况,包括代码与结果,以及关键注释 工具与来源: 以下代码与结果都可在JupyterLab上实现,更多情况可看Github 使用 NumPy ...

  9. 渗透测试-Kioptix Level 1靶机getshell及提权教程

    声明! 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无 ...

  10. 鸿蒙UI开发快速入门 —— part01: 装饰器&UI描述

    1. 背景 在鸿蒙开发中,ArkTS是优选的主力应用开发语言. ArkTS围绕应用开发在TypeScript(简称TS)生态基础上做了进一步扩展,继承了TS的所有特性,是TS的超集. 因此,在学习Ar ...