BZOJ 3709
• 有n只怪物,你的初始生命值为z。
• 为了打败第i只怪物,你需要消耗cost[i]点生命值,但怪物死后
会使你恢复val[i]点生命值。
• 任何时候你的生命值都不能小于等于0。
• 问是否存在一种打怪顺序,使得你可以打完这n只怪物而不死掉

• n≤100,000

一些怪物是赚血的,一些是亏血的。

肯定要先打完所有赚血的,再打亏血的。

打赚血的:

为了保证能够有血,先打cos小的最保险。

微扰法证明:如果先打大一些的,如果能打,那么打小一些的也能打,而且血更多了,一定还能打那一个大的。

所以,先打小的一定不劣。

打亏血的:

为了保证能够有血,先打val大的最保险。

微扰法证明:为什么会出现一个方案能打,而另一个方案就打着打着就挂了呢?

一定有:life-cos1+val1-cos2<0并且life-cos2+val2-cos1>0

(显然,如果life-cos1<0且life-cos2>0的比较是没有必要的。因为处于减血的阶段,cos1就无论如何打不了了)

(所以只能是打了前一个,然后后一个不能打了)

即:life-cos2+val2-cos1>life-cos1+val1-cos2

那么,就有:val2>val1

并且,打1再打2和打2再打1之后的血量一致,不影响后面的。(也是微扰法的适用条件之一)

所以,当一个怪物的val更大的时候,先打它一定不劣。

用堆维护即可。

AGC 018 C
• 有X+Y+Z个人,每个人有Ai个金币,Bi个银币,Ci个铜币。现在
选X个人提供金币,Y个人提供银币,Z个人提供铜币。
• 求最多提供多少币。

• X+Y+Z≤100,000

话说直接跑费用流应该能过吧(虽然太暴力)

考虑如果只有金币银币。

如果1提供金币,2提供银币比换过来更优的话,有:A1+B2>A2+B1

A,B即金币银币。

移项:A1-B1>A2-B2

所以,按照A1-B1排序,前X个提供金币,后Y个提供银币。

现在加入铜币。

之前的努力不能白费。

所以我们在按照Ai-Bi排好序的数组上进行。

枚举一个分界点,i

[1,i]用A,C来填,[i+1,X+Y+Z]用C,B来填。

两半分别用刚才的类似的排序方法求出来答案。

可以用堆维护到logn

为什么是对的?

对于我们填好的一个方案:ACACC|BBBCBB

'|'代表分界点

1.由于按照Ai-Bi排好序,所以,A和B交换不优。

2.由于分界点内部是按照Ai-Ci,Bi-Ci排序的,所以内部的A,C和B,C交换已经考虑过。

3.如果A跨过分界点和一个C交换,ACCCC|BBBABB,那么由于按照Ai-Bi排好序,所以换成ACCCC|ABBBBB会更优。

这个情况会在枚举下一个分界点的时候考虑到。

4.B跨过分界点和C交换同理。

所以,对于这样的排序方法,再加上枚举,一定可以遍历所有的可能成为最优解的方案。

总结:

1.猜结论

2.列出比较的式子。

3.枚举一维也是降低复杂度和思维含量的重要方法。

BZOJ 3709&&AGC 018 C——多段排序的微扰法的更多相关文章

  1. [PA2014] [BZOJ 3709]~[BZOJ 3719] 合集

    今天起尝试做套题喵~ (当然是因为被最大流的题目弄得恶心死了) 一共是 10 道题一道一道做 预计 3~4 内做完 尽情期待 [BZOJ 3709]Bohater 一眼就能感受到贪心的气息 因为很直观 ...

  2. BZOJ 3709: [PA2014]Bohater

    3709: [PA2014]Bohater Time Limit: 5 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 1050  Solved: ...

  3. 【贪心】bzoj 3709:[PA2014]Bohater

    3709: [PA2014]Bohater Time Limit: 5 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 653  Solved:  ...

  4. mysql创建外键出错(注意数据库表字段排序)

    1.  两个字段的类型或者大小不严格匹配.例如,如果一个是int(10),那么外键也必须设置成int(10),而不是int(11),也不能是tinyint.另外,你还必须确定两个字段是否一个为 sig ...

  5. BZOJ 1697: [Usaco2007 Feb]Cow Sorting牛排序

    Description 农夫JOHN准备把他的 N(1 <= N <= 10,000)头牛排队以便于行动.因为脾气大的牛有可能会捣乱,JOHN想把牛按脾气的大小排序.每一头牛的脾气都是一个 ...

  6. BZOJ 2938: [Poi2000]病毒 [AC自动机 拓扑排序]

    2938: [Poi2000]病毒 题意:判断是否存在无限长的不含模式串的字符串.只有01. 建出套路DP的转移图,判断有环就行了 练习一下拓扑排序 #include <iostream> ...

  7. [BZOJ 3709] Bohater

    Description 在一款电脑游戏中,你需要打败n只怪物(从1到n编号).为了打败第i只怪物,你需要消耗d[i]点生命值,但怪物死后会掉落血药,使你恢复a[i]点生命值.任何时候你的生命值都不能降 ...

  8. bzoj 3709: [PA2014]Bohater 贪心

    题目: 在一款电脑游戏中,你需要打败\(n\)只怪物(从\(1\)到\(n\)编号).为了打败第\(i\)只怪物,你需要消耗\(d_i\)点生命值,但怪物死后会掉落血药,使你恢复\(a_i\)点生命值 ...

  9. bzoj 3012: [Usaco2012 Dec]First! Trie+拓扑排序

    题目大意: 给定n个总长不超过m的互不相同的字符串,现在你可以任意指定字符之间的大小关系.问有多少个串可能成为字典序最小的串,并输出这些串.n <= 30,000 , m <= 300,0 ...

随机推荐

  1. 学习HTML 第五节.简单交互 加个按钮

    学习HTML 第五节.简单交互 也许你和我一样,对页面排版的兴趣小于网页交互,那么我们就先略过一些章节,直接先学一下简单交互. 前面点击图片打开链接的网址,已经是最简单的交互方式了,复杂的方式则需要用 ...

  2. 【Jmeter测试】使用Java请求进行Dubbo接口的测试

    如何构建一个Dubbo接口测试的通用框架(https://github.com/nitibu/jmeter-dubbo-test)​从上面的流程我们可以看出,测试类大致的一个结构: 使用json文件来 ...

  3. 网络流小结(HNOI2019之前)

    \(\text{一:Dinic最大流}\) 最坏复杂度 \({\mathcal O(n^2m)}\) 一般可以处理 \(10^4\) ~ \(10^5\) 的网络. struct Edge { int ...

  4. [转]C#学习笔记15——C#多线程编程

    一.基本概念进程:当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源.而一个进程又是由多个线程所组成的.线程:线程是程序中的一个执行流,每个线程都有自己的专有寄存 ...

  5. Material Safety Data Sheet,MSDS - 化学品安全说明书

    化学品安全说明书(Material Safety Data Sheet)MSDS,国际上称作化学品安全信息卡,是化学品生产商和经销商按法律要求必须提供的化学品理化特性(如PH值,闪点,易燃度,反应活性 ...

  6. 阿帕奇web服务器下载部署安装运行

    链接: https://jingyan.baidu.com/album/d8072ac47baf0eec95cefdca.html?picindex=4 1.apache服务安装成功可是启动失败“wi ...

  7. Python:迭代器的简单理解

    一.什么是迭代器 迭代,顾名思义就是重复做一些事很多次(就现在循环中做的那样).迭代器是实现了__next__()方法的对象(这个方法在调用时不需要任何参数),它是访问可迭代序列的一种方式,通常其从序 ...

  8. Python:集合操作总结

    集合是一组无序排列的不重复元素集 [注]:集合的最大作用是对一个序列进行去重操作 一.集合的分类 在Python中集合分为两类,为可变集合(set)和不可变集合(frozenset).对于可变集合(s ...

  9. pspo过程文档

    项目计划总结:       日期/任务      听课        编写程序         阅读相关书籍 日总计          周一      110          60         ...

  10. Right-BICEP单元测试

    一.测试方法:Right-BICEP Right-结果是否正确? B-是否所有的边界条件都是正确的? I-能查一下反向关联吗? C-能用其他手段交叉检查一下结果吗? E-你是否可以强制错误条件发生? ...