AtCoder Beginner Contest 249 F - Ignore Operations // 贪心 + 大根堆
传送门:F - Keep Connect (atcoder.jp)
题意:
给定长度为N的操作(ti,yi)。
给定初值为0的x,对其进行操作:当t为1时,将x替换为y;当t为2时,将x加上y。
最多可以跳过k步,求最终x的最大值。
思路:
注意到,当t为1时,进行替换操作,那么该位置前面的操作是不会对后面产生任何影响的,也就不会消耗k。
那么我们可以枚举最后一次不跳过的1操作,对于该位置的前面无需考虑,对于该位置的后面:所有的1操作都应跳过(记数量为cnt),且对于2操作选择数值前k - cnt小的跳过。
于是可以从后往前推,同时维护一个大小为k - cnt的大根堆(存跳过的2操作的数值),和一个增加值add(存不跳过的2操作的数值之和),则当每次遇到1操作时,此时的x值为(y + add),动态更新求最大值即可。
代码参考:
#include <bits/stdc++.h>
#define LL long long
#define PII pair<int,int>
#define fi first
#define se second
using namespace std; const int N = 200010; int n, k;
PII a[N];
priority_queue<int> heap; // 维护大根堆
void func(LL& add)
{
while(heap.size() > k) {
add += heap.top();
heap.pop();
}
} int main()
{
cin >> n >> k;
for(int i = n; i; i--) cin >> a[i].fi >> a[i].se; LL ans = -1LL << 60, add = 0;
for(int i = 1; i <= n; i++) {
int t = a[i].fi, y = a[i].se;
if(t == 1) {
ans = max(ans, y + add);
-- k;
func(add);
}
if(t == 2) {
if(y >= 0) add += y;
else heap.push(y);
func(add);
}
if(k < 0) break;
}
if(k >= 0) ans = max(ans, add); cout << ans << endl; return 0;
}
AtCoder Beginner Contest 249 F - Ignore Operations // 贪心 + 大根堆的更多相关文章
- AtCoder Beginner Contest 137 F
		AtCoder Beginner Contest 137 F 数论鬼题(虽然不算特别数论) 希望你在浏览这篇题解前已经知道了费马小定理 利用用费马小定理构造函数\(g(x)=(x-i)^{P-1}\) ... 
- AtCoder Beginner Contest 253 F - Operations on a Matrix // 树状数组
		题目传送门:F - Operations on a Matrix (atcoder.jp) 题意: 给一个N*M大小的零矩阵,以及Q次操作.操作1(l,r,x):对于 [l,r] 区间内的每列都加上x ... 
- AtCoder Beginner Contest 261 F // 树状数组
		题目链接:F - Sorting Color Balls (atcoder.jp) 题意: 有n个球,球有颜色和数字.对相邻的两球进行交换时,若颜色不同,需要花费1的代价.求将球排成数字不降的顺序,所 ... 
- AtCoder Beginner Contest 260 F - Find 4-cycle
		题目传送门:F - Find 4-cycle (atcoder.jp) 题意: 给定一个无向图,其包含了S.T两个独立点集(即S.T内部间的任意两点之间不存在边),再给出图中的M条边(S中的点与T中的 ... 
- AtCoder Beginner Contest 247 F - Cards // dp + 并查集
		原题链接:F - Cards (atcoder.jp) 题意: 给定N张牌,每张牌正反面各有一个数,所有牌的正面.反面分别构成大小为N的排列P,Q. 求有多少种摆放方式,使得N张牌朝上的数字构成一个1 ... 
- Atcoder Beginner Contest 118 C-Monsters Battle Royale(贪心)
		题目链接 题意就是要让给出的数字去互相取余,看看能得到最小的数事多少. 那么就可以从小到大排序,每一次都贪心地把最小的数作为攻击者,去攻击其他的数字(也就是大的取余小的),然后再一次排序,循环这个过程 ... 
- AtCoder Beginner Contest 133 F Colorful Tree
		Colorful Tree 思路: 如果强制在线的化可以用树链剖分. 但这道题不强制在线,那么就可以将询问进行差分,最后dfs时再计算每个答案的修改值, 只要维护两个数组就可以了,分别表示根节点到当前 ... 
- AtCoder Beginner Contest 137 D题【贪心】
		[题意]一共有N个任务和M天,一个人一天只能做一个任务,做完任务之后可以在这一天之后的(Ai-1)天拿到Bi的工资,问M天内最多可以拿到多少工资. 链接:https://atcoder.jp/cont ... 
- AtCoder Beginner Contest 181  E - Transformable Teacher  (贪心,二分)
		题意:有一长度为奇数\(n\)的数组\(a\),和长度为\(m\)的数组\(b\),现要求从\(b\)中选择一个数放到\(a\)中,并将\(a\)分成\((n+1)/2\)个数对,求最小的所有数对差的 ... 
随机推荐
- 【Electron】使用 build-tools 在 Windows 中编译 electron
			[Electron]使用 build-tools 在 Windows 中编译 electron 提前准备 预留好磁盘空间 Git 缓存目录:%UserProfile%/.git_cache ,大概有 ... 
- psexec.py规避杀软
			前言 在内网渗透中,当获取到一个账号密码后,经常会使用impacket套件中的psexec.py进行远程连接并执行命令,但是因为用的人多了,杀软也对psexec.py特征进行了拦截,也就导致了如果使用 ... 
- 实验:Python图形图像处理
			1. 准备一张照片,编写Python程序将该照片进行图像处理,分别输出以下效果的图片:(a)灰度图:(b)轮廓图: (c)变换RGB通道图:(d)旋转45度图. 2. 假设当前文件夹中data.csv ... 
- Java高并发-无锁
			一.无锁类的原理 1.1 CAS CAS算法的过程是这样:它包含3个参数CAS(V,E,N).V表示要更新的变量,E表示预期值,N表示新值.仅当V值等于E值时,才会将V的值设为N,如果V值和E值不同, ... 
- Windows环境下启动Redis报错:Could not create server TCP listening socket 127.0.0.1:6379: bind: 操作成功完成。(已解决)
			问题描述: 今天在windows环境下启动Redis时启动失败报错: 解决方案: ①运行命令:redis-cli.exe ②退出Redis ③运行命令:redis-server.exe redis.w ... 
- HIVE 数据分析
			题目要求: 具体操作: ①hive路径下建表:sale create table sale (day_id String, sale_nbr String, buy_nbr String, cnt S ... 
- yolov2学习笔记
			Yolov2学习笔记 yolov2在yolov1的基础上进行一系列改进: 1.比如Batch Normalization,High Resolution Classifier,使用Anchor Box ... 
- yolov1学习笔记
			yolov1学习笔记 yolov1将目标检测归为一个回归问题,具有real-time的特点.局限性是:对于群体性的小目标检测效果很差. 论文概括 本文重新构造目标检测作为一个回归问题. 直接输入图像到 ... 
- java面试:关于public static void main(String[] args)是什么意思?
			它是作为JAVA中的主函数,所有java程序的运行起点就是这个方法,除了args这个名字可以不一样外,其他必须是这样. 主函数的一般写法如下: public static void main(Stri ... 
- .NET C#杂谈(1):变体 - 协变、逆变与不变
			0. 文章目的: 介绍变体的概念,并介绍其对C#的意义 1. 阅读基础 了解C#进阶语言功能的使用(尤其是泛型.委托.接口) 2. 从示例入手,理解变体 变体这一概念用于描述存在继承关系的 ... 
