题面

CF436E Cardboard Box

\(n\) 个关卡,对每个关卡可以花 \(a_i\) 时间得到 \(1\) 颗星,或花 \(b_i\) 时间得到 \(2\) 颗星,或不玩。问获得 \(m\) 颗星最少需要多少时间。

数据范围:\(1\le n\le 3\cdot 10^5\),\(1\le m\le 2n\),\(a_i<b_i\)。


题解

蒟蒻做这题时已经知道是反悔贪心了,但是做了 \(4\) 个小时做不出来。于是去看题解,感觉这个 \(5\) 堆做法太非人类了,于是去看 CF 题解和代码后总结出了蒟蒻的不用反悔贪心的做法和题解。

如果不反悔贪心,那么每一步必须保证没有后效性地最优。

很明显如果只有 \(a_i\),排序可以满足这个条件。

这题最朴素的错误做法是用一个小顶堆,刚开始把所有 \(a_i\) 丢进去,然后 \(m\) 次每次取堆顶,如果选了 \(a_i\) 把 \(b_i-a_i\) 也丢进去。

如果 \(a_i\) 都很大,\(b_i-a_i\) 都很小这样显然是亏的。

假如某个 \(i\) 打出 \(2\) 星是当前最优,如果 \(a_i\) 已经取了按照上面的办法肯定没有问题;但是如果 \(a_i\) 都没取,\(a_i\) 不一定是单个中的最优。

所以这篇题解最重要的骚操作就来了:选之前权衡,选两个的最优还是一个的最优:哪个更优?

可以用一个 vis 数组记录打了那些关卡,每次把打了的从堆中扔掉,这样就可以假定堆中的都是没有打过的了。


代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
#define x first
#define y second
#define bg begin()
#define ed end()
#define pb push_back
#define mp make_pair
#define sz(a) int((a).size())
#define R(i,n) for(int i(0);i<(n);++i)
#define L(i,n) for(int i((n)-1);~i;--i)
const int iinf=0x3f3f3f3f;
const ll linf=0x3f3f3f3f3f3f3f3f; //Data
const int N=3e5,sN=N<<1;
int n,m,star[N];
ll a[sN],ns; bool vis[sN];
priority_queue<pair<ll,int>> o,t;
void ref(priority_queue<pair<ll,int>> &q){
while(sz(q)&&vis[q.top().y]) q.pop();
} //Main
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>m;
R(i,n) cin>>a[i]>>a[i+n],a[i+n]-=a[i],
o.push(mp(-a[i],i)),t.push(mp(-a[i]-a[i+n],i));
while(m--){
ref(o),ref(t);
int i=o.top().y; o.pop(),ref(o);
if(m&&sz(t)&&a[i]-o.top().x>=-t.top().x)
o.push(mp(-a[i],i)),i=t.top().y,t.pop();
i<n&&(o.push(mp(-a[i+n],i+n)),true);
ns+=a[i],star[i%n]++,vis[i]=true;
}
cout<<ns<<'\n';
R(i,n) cout<<star[i],i==n-1&&(cout<<'\n');
return 0;
} /* 可以考虑不反悔:权衡一个两个哪个优! */

祝大家学习愉快!

题解-CF436E Cardboard Box的更多相关文章

  1. CF436E Cardboard Box(贪心)

    题意 有nnn个关卡,第iii关可以花费aia_iai​的代价打一颗星,bib_ibi​的代价打两颗星.保证1≤ai<bi≤1091\le a_i<b_i\le10^91≤ai​<b ...

  2. Codeforces 436E Cardboard Box (看题解)

    Cardboard Box 贪了个半天贪不对, 我发现我根本就不会贪心. 我们先按b排序, 然后枚举选两颗心的b的最大值, 在这个之前的肯定都要选一个, 因为前面的要是一个都没选的话, 你可以把当前选 ...

  3. 题解 CF1428A 【Box is Pull】

    通过理解题意,我们发现: 当需要拐弯的时候,兔子需要先走回箱子的位置,再走向拐弯的方向.则拐弯操作的花费为 \(2\) .而直行的操作花费为 \(1\) . 所以, 如果不需要拐弯,也就是 \(x1= ...

  4. Codeforces 436E - Cardboard Box(贪心/反悔贪心/数据结构)

    题面传送门 题意: 有 \(n\) 个关卡,第 \(i\) 个关卡玩到 \(1\) 颗星需要花 \(a_i\) 的时间,玩到 \(2\) 颗星需要 \(b_i\) 的时间.(\(a_i<b_i\ ...

  5. upc组队赛12 Cardboard Container【枚举】

    Cardboard Container Problem Description fidget spinners are so 2017; this years' rage are fidget cub ...

  6. uva 580 危险的组合(排列组合)

    Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Descript ...

  7. CF数据结构练习

    1. CF 438D The Child and Sequence 大意: n元素序列, m个操作: 1,询问区间和. 2,区间对m取模. 3,单点修改 维护最大值, 取模时暴力对所有>m的数取 ...

  8. SGU 495. Kids and Prizes

    水概率....SGU里难得的水题.... 495. Kids and Prizes Time limit per test: 0.5 second(s)Memory limit: 262144 kil ...

  9. Kids and Prizes(SGU 495)

    495. Kids and Prizes Time limit per test: 0.25 second(s)Memory limit: 262144 kilobytes input: standa ...

随机推荐

  1. nginx&http 第三章 ngx http ngx_http_process_request_headers

    HTTP 请求行正确处理完成后,针对 HTTP/1.0 及以上版本紧接着要做的就是请求 HEADER 的处理与解析了 /** * 用于处理http的header数据 * 请求头: * Host: lo ...

  2. 在一个递增数组的rotate变换中找target

    Search in Rotated Sorted Array Suppose an array sorted in ascending order is rotated at some pivot u ...

  3. 一次webpack小规模优化经历

    这标题一点营销号味道都没有,怎么会有人看啊!(笑) 没人看也无所谓的文章背景: 八月份入职了新公司,是个好几年的老项目了,公司产品是存在很久了,但我接触到的代码版本保守估计应该是有个三年到四年这样的历 ...

  4. Vue单元测试vue2-jest-coverage的package.json 配置

     依赖的版本很重要,不要出错了 devDependencies:{ "babel-core": "^6.26.3", "babel-jest" ...

  5. asyncio多进程+pyppeteer浏览器控制+pyquery解析实现爬虫demo

    import asyncio from pyppeteer import launch from pyquery import PyQuery as pq async def main(): brow ...

  6. linux系统中 SElinux安全子系统

    1.SElinux 是什么? SElinux(Security-Enhanced Linux)是美国国家安全局在linux开源社区的帮助下开发的一个强制访问控制(Mandatory Access Co ...

  7. 从txt中提取子域名

    import re DOMAIN =[] f = open('test.txt','r',encoding='UTF-8') w = open('domain.txt','w') for data i ...

  8. kali 系列学习05 - Nessus 安装及配置

    Nessus 安装 1.https://www.tenable.com/products/nessus/select-your-operating-system    点此下载nessus选择适合自己 ...

  9. Edison:FL Studio中的常用音频录制与剪辑插件

    Edison是FL Studio中的一个完全集成的音频编辑和录制工具.Edison加载到效果插槽(在任何调音台音轨中),然后录制或播放该位置的音频.您可以在任意数量的混音器轨道或效果插槽中根据需要加载 ...

  10. open()和with open() as的区别

    2020-03-18  20:37:55 open()和with open() as的区别 1 file = open("test.txt","r") 2 fo ...