首页 > 其他分享 >abc249_f Ignore Operations 题解

abc249_f Ignore Operations 题解

时间:2023-04-16 14:13:14浏览次数:54  
标签:pq int 题解 sum Ignore num 答案 abc249 操作

Ignore Operations

题意

Takahashi 有一个整数 \(x\),初始 \(x = 0\)。

有 \(n\) 次操作。第 \(i\) 次操作用两个整数 \(t_i, y_i\) 描述:

  • 如果 \(t_i = 1\),将整数 \(x\) 替换为 \(y_i\)。
  • 如果 \(t_i = 2\),将整数 \(x\) 替换为 \(x + y_i\)。

Takahashi 可以跳过其中至多 \(K\) 次操作。对于剩下的没跳过的操作序列,按顺序执行操作,并求出最终 \(x\) 的可能最大值。

数据范围

  • \(0 \leqslant k \leqslant n \leqslant 2 \times 10^5, n \geqslant 1\)
  • \(t_i \in \{ 1, 2\}, |y_i| \le 10^9\)

思路

我们肯定不会跳过那些对答案有正面作用的操作,那其他的呢?

来看一张草图。

显然,在最后一次赋值操作以前,所有操作均可视为没有

那么在最后一次赋值操作之后的那些操作呢?跳过第 \(i\) 次操作的话,对答案的贡献就是:\(-y_i\),当我们跳过次数超过 \(k\) 时,我们要做出取舍:把对答案贡献最小的那一次放弃。

那么,我们可以推出第一步:从后往前找,用堆来存储每次操作对答案的贡献,模拟一下上面的那种操作即可。

那问题是,处理好了最后一次赋值操作以后的所有,那前面的怎么办呢?

这也不难,令 \(sum_i\) 表示从操作 \(1\) 执行到操作 \(i\)、一次也不跳过的情况下的答案,那么删除最后一次赋值操作(\(j\))对答案的贡献就是 \(sum_{i - 1} - sum_i\),且这次操作是不可逆的,即永久消耗这次操作

统计答案即可。

复杂度

  • 时间:\(O(n \log n)\)
  • 空间:\(O(n)\)

Code

点击查看代码
#include <iostream>
#include <queue>

using namespace std;
using ll = long long;

const int N = 2e5 + 10;

struct Node {
  int op, t;
} a[N];

int n, k;
ll x, y, sum[N], ans, num;
priority_queue<int> pq; // 堆维护

int main () {
  ios::sync_with_stdio(0), cin.tie(0);
  cin >> n >> k;
  for (int i = 1; i <= n; i++) {
    cin >> a[i].op >> a[i].t;
    if (a[i].op == 1) { // 预处理 sum
      sum[i] = a[i].t;
    } else {
      sum[i] = sum[i - 1] + a[i].t;
    }
    ans = sum[i];
  }
  for (int i = n; k && i >= 1; i--) {
    if (a[i].op == 2 && a[i].t < 0) { // 操作 2
      pq.push(a[i].t); // 答案贡献,这里取了个反
      num += a[i].t; // 贡献之和
      if (pq.size() > k) { // 操作次数超过 k
        num -= pq.top(), pq.pop(); // 去掉答案贡献最小的
      }
    } else if (a[i].op == 1) { // 操作 1
      num += sum[i] - sum[i - 1];
      if (pq.size() == k) {
        num -= pq.top(), pq.pop();
      }
      k--; // 不可逆的操作
    }
    ans = max(ans, sum[n] - num); // 计算答案最大值
  }
  cout << ans;
  return 0;
}

标签:pq,int,题解,sum,Ignore,num,答案,abc249,操作
From: https://www.cnblogs.com/lw0-blog/p/17323159.html

相关文章

  • TJOI 2015 概率论 题解
    TJOI2015概率论题解题意求\(n\)个点随机生成的有根二叉树(所有互不同构的二叉树出现情况等概率)的叶子节点数的期望值。题解70答案显然是\(\dfrac{g(n)}{f(n)}\),\(g(n)\)是\(n\)个点为所有二叉树的叶子总数,\(f(n)\)是\(n\)个点能生成的二叉树数。一棵树可以用左......
  • abc249_d Index Trio 题解
    IndexTrio题意给定长度为\(n\)的整数序列\(a=(a_1,a_2,\dots,a_n)\)。请你求出有多少个整数三元组\((i,j,k)\)满足:\(1\leqslanti,j,k\leqslantN\)\(\frac{a_i}{a_j}=a_k\)数据范围\(1\leqslantn,a_i\leqslant2\times10^5\)思路转变式子:\(......
  • Ubuntu系统硬盘安装到其他的电脑上,网络连接不上问题解决
    把Ubuntu系统硬盘安装到其他的电脑上,网络连接不了在一台i5电脑上安装好ubuntu18.04后,把该系统磁盘安装到另外一台i5电脑上。系统可以成功启动,但是不能正常上网。解决办法如下:1)用下面这个命令查看本台电脑上可用的网络接口$ifconfig-a#查看可用的网络接口$iplinks......
  • 题解:【ABC298G】Strawberry War
    题目链接场上被F干碎了,没看见这个典题。原题差不多是这个吧......
  • 栈和队列经典题题解
    目录......
  • NOC 2022 初中组选择和编程题题解
    NOC2022初中组选择题和编程题题解注意:本文有几个问题:部分题目我也不确定答案,而且我水平不行,有些题目我还真不会,大家就把我的答案当个参考吧。目前有一大半的题目因为作者比较懒,暂时没写,空在那儿,可以下载原题自己做做。1初中组选拔赛原题链接,提取码:efy6。1.1选择题......
  • 超级码力初赛第三场 最大公倍数 题解
    题目描述小栖有一个区间[a,b],他准备从中取三个数,他想知道如何取才能使得它们的最小公倍数最大请直接告诉小栖最小公倍数是多少。1<=a<b<=5000b-a>=2示例示例1:输入:a=3,b=6输出:60样例解释:4,5,6的最小公倍数是60来源:九章算法解题思路每三个数为一......
  • windows pip问题解决(working)
    当pip无法起效时,尝试python-mpippython-mpip会使用您指定为python的Python解释器来执行pip。因此,/usr/bin/python3.7-mpip表示您正在执行位于/usr/bin/python3.7的解释器的pip。如果您不熟悉这个标志以及它是如何工作的,您可以阅读有关-m的文档......
  • git 遇到的CApath: none问题解决
    在适应git时,遇到了如下问题。fatal:unabletoaccess'https://github.com/brunosimon/folio-2019.git/':errorsettingcertificateverifylocations: CAfile:D:/明月下/Git/mingw64/ssl/certs/ca-bundle.crtCApath:none第一反应是查找这个文件是什么,在不在。首先这......
  • [P4317 花神的数论题]题解
    P4317花神的数论题【数位DP】题目描述最开始其实没有什么想法第一次遇见数位dp求相乘的题想就按照常规做法来做,但不知道如何去处理*于是写了一个错误的代码//当前枚举到第id位,前面的1的个数为sum,是否达到上限limitlldfs(intid,intsum,intlimit){//1.出口if(id==......