看上去像是一个最大权闭合子图裸题但是数据太大 我们可以先把守卫的视野转换到第二象限(每个守卫可以看到横坐标比他小 纵坐标比他大的宝物) 然后按X从小到大 再按Y从大到小排 这样我们就可以按SORT序遍历守卫 然后贪心地把每个守卫的流量流给离他最近的Y最小的宝物 易证这样是最优的 #include<bits/stdc++.h> #define ll long long using namespace std; inline void read(int &x) { char c; ; ')…
[BZOJ3716][PA2014]Muzeum(贪心,网络流) 题面 BZOJ 题解 很明显可以写最大权闭合子图,然后会\(TLE\)成傻逼. 为了方便,就把一个警卫能够看到的范围处理一下(把坐标系处理一下),强制让他看到一个\(90°\)的夹角,再旋转一下就可以变成强制看到右下角的范围. 我们知道最大权闭合子图求出来的最小割=最大流. 那么我们来模拟这个过程,首先把所有警卫加入进来,其流量为贿赂他的代价.按照\(x\)轴排序之后,把所有它能够看到的宝物拿进来,然后考虑向谁流,会流向他能够看见…
[PA2014]Muzeum 题目大意: 有\(n\)件展品和\(m\)个警卫,每件展品有一个坐标\((x_i,y_i)\)和价值\(v_i\),每个警卫的坐标为\((x_i,y_i)\).每个警卫面朝\(y\)轴负方向,左右视角都为\(\theta\),警卫视线范围内的展品不能偷.你可以收买一些警卫,使其放弃安保工作,收买第\(i\)个警卫的价格为\(v_i\).你需要收买一些警卫并偷走一些展品,求盗取的总价值\(-\)收买的支出的最大值. 思路: \(\tan(\theta)=\frac w…
BZOJ 题意: 在二维网格图中有\(n\)个物品,每个物品有价值:但有\(m\)个警卫看管这些物品,每个警卫面朝\(y\)轴负方向,能看到一定角度(假定能够看到无穷远). 现在每个敬畏有一个贿赂价钱,通过贿赂能让警卫闭眼.如果一个物品没被任何警卫看到,则可以取走它. 问最后获得的最大价值为多少. 思路: 最直接的思路就是一个最大权闭合子图的建模,但边数为\(O(n^2)\),强行搞直接\(T\)飞. 然后呢...因为最小割等于最大流,又因为这个是二分图,所以我们可以模拟最大流(想不到...).…
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3716 http://www.lydsy.com/JudgeOnline/problem.php?id=4251 [题解] 非常妙的网络流转化 首先可以把警卫和宝藏看成最大权闭合子图,用最小割的那种建模方法,即一开始加进来所有宝藏的价值 然后S连宝藏,警卫连T,有覆盖关系的连inf 那么就是一个最小割,复杂度是$O(maxflow(n+m, nm)$,显然承受不了. 由于最小割和最大流等价,…
Description 吉丽的漫展有n件手办和m名警卫.建立平面直角坐标系,每个手办和警卫都可以看做一个点.警卫们的目光都朝着y轴负方向,且都有相同大小的视角.警卫可以看见自己视角内(包括边界上的点)的所有手办,不用考虑视线的遮挡. 你打算抢劫吉丽的漫展,但不可被警卫发现.为了实施这次抢劫计划,你可以事先贿赂某些警卫,让他们闭上眼睛.只要某件手办不在任何睁着眼睛的警卫的视野内,你就可以偷走它.你知道每件手办的价格,以及每位警卫需要接受多少钱的贿赂.你想知道自己的最大收益是多少. Solution…
bzoj-3709 PA-2014 Bohater 题目大意:在一款电脑游戏中,你需要打败n只怪物(从1到n编号).为了打败第i只怪物,你需要消耗d[i]点生命值,但怪物死后会掉落血药,使你恢复a[i]点生命值.任何时候你的生命值都不能降到0(或0以下).请问是否存在一种打怪顺序,使得你可以打完这n只怪物而不死掉. 数据范围:$1\le n,Hp_{ori}\le 10^5$,$0\le d_i,a_i\le 10^5$. 想法: 期望找到这样一个顺序是的打完不死掉. 我们把怪物分成两种. 第一…
[BZOJ4619][Wf2016]Swap Space Description 你有许多电脑,它们的硬盘用不同的文件系统储存数据.你想要通过格式化来统一文件系统.格式化硬盘可能使它的容量发生变化.为了格式化,你需要买额外的硬盘.当然,你想要买容量最小的额外储存设备以便省钱.你可以按任意顺序格式化硬盘.格式化之前,你要把该硬盘上所有数据移到一个或更多的其他硬盘上(可以分割数据).格式化后,该硬盘可以立刻开始使用.你没有必要把数据放到它原来所在的硬盘上.数据也可以被放到你额外买的硬盘上.举个例子,…
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3717 题解 这道题大概也就只能算常规的状压 DP 吧,但是这个状态和转移的设计还是不是很好想. 首先很显然,要优先把物品往大的包里面装,直到装不了别人再去装下一个. 可以考虑贪心的策略,如果这个背包还能塞下的话,那么一定要去塞,这样至少是不会差的. 所以令 \(dp[S]\) 表示要装下 \(S\) 中的东西需要多少背包,\(f[S]\) 表示如果要达到 \(dp[S]\) 的结果,那么最后…
~~~题面~~~ 题解: 首先有一个比较明显的策略,肯定先要把能带给自己受益的先选完,然后再以最佳状态去打那些会给自己带来损失的怪. 对于前一部分(可以带来受益的怪),显然我们需要先从代价小的打起,因为这样可以把生命值越积越多,打代价大的怪也更容易成功. 那么对于后一部分怎么办呢?我们需要从受益大的打起,为什么? 证明: 假设一个怪的受益为back,代价为cost,那么首先假设我们打完所有怪之后剩下have的生命值,那么have的大小是固定的,不会随着操作顺序而改变,因此我们可以考虑用这个来倒推…