\(\text{Solution}\)

其实不想写(因为不好写。。。

所以贴贴 \(\text{Solution}\)

然而就关于这题而言讲得也不太清楚

可撤销贪心就是维护当前状态的最优解,同时考虑以后的反悔

顺着题解,本题在 \(k<val\) 时必然换一种购买方式

而当 \(k\ge val\) 时,有两种方式,一种可能使当前解更优,但另一种却可以留下两次免费获取的机会

所以令 \(res=2val-k\),压入堆中,对应当前解更优

而 \(res\) 以后可以被弹出,更改之前的决策,在当前免费取两次进而获得当前更优解

然而贴 \(\text{Code}\) 的原因是本人手打了个堆(几千年以来的壮举

\(\text{Code}\)

#include <cstdio>
#include <iostream>
#include <algorithm>
#define IN inline
using namespace std;
typedef long long ll; const int N = 5e5 + 5;
int n, a[N], b[N], c[N], d[N]; IN void read(int &x) {
x = 0; char ch = getchar(); int f = 1;
for(; !isdigit(ch); f = (ch == '-' ? -1 : f), ch = getchar());
for(; isdigit(ch); x = (x<<3)+(x<<1)+(ch^48), ch = getchar());
x *= f;
} struct Heap {
int d[N], siz;
IN Heap() {siz = 0;}
IN void Up(int x) {while (x > 1 && d[x] < d[x >> 1]) swap(d[x], d[x >> 1]), x >>= 1;}
IN void Down(int x) {
int y = (x << 1);
while ((y <= siz && d[x] > d[y]) || (y < siz && d[x] > d[y + 1])) {
if (y < siz && d[y] > d[y + 1]) ++y;
swap(d[x], d[y]), x = y, y = (x << 1);
}
}
IN int size() {return siz;}
IN int top() {return d[1];}
IN void pop() {d[1] = d[siz--], Down(1);}
IN void push(int x) {d[++siz] = x, Up(siz);}
}Q; int main() {
read(n);
ll ans = 0;
for(int i = 1; i <= n; i++) read(b[i]), ans += b[i];
sort(b + 1, b + n + 1), reverse(b + 1, b + n + 1);
int m = 0;
for(int i = 1, j; i <= n; i = j + 1) {
j = i;
while (j < n && b[j + 1] == b[i]) ++j;
a[++m] = b[i], c[m] = j - i + 1;
}
int num = 0;
for(int i = 1; i <= m; num += c[i++]) {
int rest = min(num - Q.size() * 2, c[i]), cnt = 0;
for(int j = 1; j <= rest; j++) d[++cnt] = a[i];
rest = c[i] - rest;
for(int j = 1; j <= rest; j += 2) {
if (!Q.size()) break;
int k = Q.top(); Q.pop();
if (k < a[i]) {d[++cnt] = a[i]; if (j < rest) d[++cnt] = a[i];}
else {d[++cnt] = k; if (j < rest) d[++cnt] = a[i] * 2 - k;}
}
for(int j = 1; j <= cnt; j++) if (d[j] >= 0) Q.push(d[j]);
}
while (Q.size()) ans -= Q.top(), Q.pop();
printf("%lld\n", ans);
}

最新文章

  1. The Zen of Python
  2. bzoj1078【SCOI2008】斜堆
  3. CSS中对图片(background)的一些设置心得总结
  4. 如何创建一个Android项目
  5. IOS之未解问题--关于IOS图像渲染CPU和GPU
  6. PHP Header 缓存 --- Header 参数说明
  7. 安装Office时出现windows installer服务不能更新一个或多个受保护的windows文件错误的解决方法
  8. keil采用C语言模块化编程时全局变量、结构体的定义、声明以及头文件包含的处理方法
  9. Chrome扩展与用户隐私
  10. React 笔记
  11. lucene全文搜索之一:lucene的主要功能和基本结构(基于lucene5.5.3)
  12. Android studio java.lang.UnsatisfiedLinkError
  13. mysql:视图,触发器,事务,存储过程,函数
  14. audio autoplay 是pause 不会停止播放
  15. VS2015 IIS Express 无法启动 解决办法
  16. java-Array数组常用操作例子(基础必备)
  17. D. Vasya and Triangle
  18. PHP 变量类型的强制转换 &amp; 创建空对象
  19. java编程调试技巧
  20. bzoj4542 大数

热门文章

  1. rpm和yum仓库
  2. TabControl控件的简单使用-添加tab
  3. 解决aspnetcore-browser-refresh.js:234 WebSocket connection to &#39;wss://localhost:62356/Admin/&#39; failed问题
  4. kernel 启动流程
  5. 安装aio-pika报错
  6. 铁威马NAS如何开启二次验证提高系统安全性
  7. 事件 jQuery类库、Bootstrap页面框架
  8. [常用工具] 深度学习Caffe处理工具
  9. ArcGIS工具 - 导出数据库结构
  10. S2-009 CVE-2011-3923