440 likes | 646 Views
æ‚题. 何亮 roba269@gmail.com. 最大内空凸多边形. TOJ 1495 The Picnic. 最大内空凸多边形. 首先把全部点排水平åºï¼Œä¾æ¬¡æžšä¸¾ï¼Œä½œä¸ºå‡¸åŒ…的左下角的点(设为点 p )。 ä¿ç•™åœ¨ç‚¹ p 峿–¹åŠä¸Šæ–¹çš„点,将这些点按æžè§’åºæŽ’åˆ— æŒ‰ç…§æ¤æžè§’åº DP…. 最大内空凸多边形. 用 dp[i][j] 表示当å‰çš„å‡¸åŒ…ä¸æœ€åŽçš„两点分别为 i,j 的最大é¢ç§¯ã€‚ 首先必须满足:点 p,i,j 组æˆçš„三角形为空 转移方程: dp[i][j] = max{dp[k][i]} + S(p,i,j) [for all k<i]
E N D
杂题 何亮 roba269@gmail.com
最大内空凸多边形 • TOJ 1495 The Picnic
最大内空凸多边形 • 首先把全部点排水平序,依次枚举,作为凸包的左下角的点(设为点p)。 • 保留在点p右方及上方的点,将这些点按极角序排列 • 按照此极角序DP…
最大内空凸多边形 • 用dp[i][j]表示当前的凸包中最后的两点分别为i,j的最大面积。 • 首先必须满足:点p,i,j组成的三角形为空 • 转移方程: dp[i][j] = max{dp[k][i]} + S(p,i,j) [for all k<i] 其中必须满足k->i与i->j成左转关系 • 此步复杂度O(n^3),总复杂度O(n^4)
CEOI 2008 Fence • 平面上的某些点上有树,另一些点上有预先挖好的洞。我们需要买一些木桩插在某些洞里,然后绕着木桩围上篱笆,使得围住一部分树木。 • 每棵木桩费用为20,篱笆无费用。如果某树没有被围住,则它会丢失,每丢一棵树成本为111。 • 故若买P个木桩,丢K棵树,总花费为20P+111K。求一个花费最小的方案。
CEOI 2008 Fence • 输入数据为树木和洞的位置,数量都<=100
CEOI 2008 Fence • 几点观察: • 最多只需围一个凸包 • 即使花费三个木桩围住一棵树也是值得的 • 故我们要首先保证围住尽可能多的树,然后再想办法减少不必要的木桩
CEOI 2008 Fence • Step1. 求全部有洞的点的凸包 O(nlogn) • Step2. 检查凸包中有多少棵树,得到可以围住的树集合S O(nm) • Step3. 新建一个图,以所有洞点为顶点 • 对每个洞点对(x,y),检查S中所有树是否都在向量x->y左侧,若是,则在图中连边(x,y) O(n^2*m) • 在图中找一个权值最小的环即可 O(n^3)
CEOI 2008 Knights • 国际象棋棋盘上有N个马,马只能向四个方向移动,且不能走出边界。两人轮流走,每人每次必须把所有可移动的马都按照规则移动一步。不能继续移动的人判负。问胜负情况,以及若先手胜,先手的第一步应如何走。 • 多个马可以在同一位置 • 棋盘大小K<=200,000, N <= 1,000,000
CEOI 2008 Knights • Input • 3 4 • 2 3 • 3 2 • 4 4 • Output • No • Input 2 3 2 3 3 2 • Output YES 1 1 1 1
CEOI 2008 Knights • 首先考虑只有一个马的情况 • 左下角的2*2为必败格 • 如果从某格出发可以走到必败格,则此格为必胜格 • 如果从某格出发能走到的全是必胜格,则此格为必败格 ………… 1 1 1 1 1 1 1 1 1 1 … 0 0 1 1 0 0 1 1 0 0 … 0 0 1 1 0 0 1 1 0 0 … 1 1 1 1 1 1 1 1 1 1 … 1 1 1 1 1 1 1 1 1 1 … 0 0 1 1 0 0 1 1 0 0 … 0 0 1 1 0 0 1 1 0 0 …
CEOI 2008 Knights • 可以把每个马看作单独的Nim游戏,利用S-G函数求解吗? • 因为要求每次必须对所有马都走一步,所以不行…… • 换个角度,若所有马都在必败格,则先手必败;若有一个马在必胜格上呢?
CEOI 2008 Knights • 实际上,先手方应采取的策略是 • 若马在必胜格,则尽可能地“拖延时间”(当然,要保证仍握有主动权) • 若马在必败格,则尽可能快地将其走死
CEOI 2008 Knights • 对所有格子x我们定义函数m(x)如下 • 如果x在必败格 m(x)=min{m(x’)}+1 x’为x可达到的点 • 如果x在必胜格 m(x)=max{m(x’)}+1 x’为x可达的必败点 • 边界条件:对左下角2*2格子k,m(k)=0
CEOI 2008 Knights • 则,若存在在必胜格p上的马的m(p)大于所有必败格上的马,则必胜 • DP? 对如此大范围可以出解? • 暴力生成表…
0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 1 1 1 3 3 3 3 5 5 5 5 7 7 7 7 9 1 1 3 3 3 3 5 5 5 5 7 7 7 7 9 9 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 3 3 3 5 5 5 5 7 7 7 7 9 9 9 9 11 3 3 5 5 5 5 7 7 7 7 9 9 9 9 11 11 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 5 5 5 7 7 7 7 9 9 9 9 11 11 11 11 13 5 5 7 7 7 7 9 9 9 9 11 11 11 11 13 13 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 7 7 7 9 9 9 9 11 11 11 11 13 13 13 13 15 7 7 9 9 9 9 11 11 11 11 13 13 13 13 15 15
CEOI 2008 Knights • 注意边界…… • Solution by rng_58 @ Topcoder
CEOI 2008 Order • 给定一些任务,每个任务需要某些机器来完成,完成每个任务可以有相应的收益。机器可以买也可以租。不同的机器有不同的价格,不同的机器对不同的任务分别有不同的租金。机器只需买一次就可以无限使用,如果租机器则只能用在当前这次。 • 求最大的收益。 • 机器数<=1200, 任务数<=1200
NOI 2006 Profit • 复习一个简化版问题——NOI 2006 Profit • 每个用户群Ci需要两个中转站ai和bi,已知建造每个中转站的花费以及为每个用户群服务所得收入。求总利润的最大值。 • 总利润 = 收入 - 花费
NOI 2006 Profit • 新加S,T,对S和用户群连边,容量为该用户群的收益,对通讯站和T连边,容量为该通讯站的花费。对用户群和其所需通讯站连边,容易为正无穷。 • 此网络的一个割对应一种方案: S一侧的割集,表示不为其提供服务的用户群和需要建立的通讯站。
NOI 2006 Profit 1 1 2 S集中的点为选择服务的用户群及修建的通讯站 S 2 T 3 3 用户群 4 通讯站
CEOI 2008 Order • 回到原题,CEOI此题的不同之处是,允许出现“租”的情况 • 中间边的容量不为无穷大?
CEOI 2008 Order • 割与方案仍然对应 • S集中的点表示要完成的任务以及要买的机器 • 若任务在S集,所需机器在T集,租金a则计入割的容量中 • 若任务不在S集,“浪费”的收益b计入割容量 • 若机器在S集,买机器花费c计入割的容量 • 总花费为三部分之和,净利润为所有任务的收益增去总的花费。求最小割,即使得a+b+c最小,也即净利润最大。
CEOI 2008 Information • 给定有向图及其中一点r,求两棵以r为根,无公共边的“树型图”,使得其边权值总和最小 • 点数N <= 2,000, 边数M <= 1,000,000 • …
CEOI 2008 Dominance • W*H的格子里有两种细菌,给出每个细菌的位置和感染范围。当某个格子m个A细菌和n个B细菌感染时,若m>n,我们说此格子被A支配了,若m<n,则此格被B支配。 • 现要求出分别被两种细菌支配的格子数 • W,H<=109, 细菌数N <= 3000
APIO 2007 Backup • 给定直线上的N个楼,现有K条网线,要求给其中的2K个楼两两配对,使得网线的总长度尽可能小。 • N <= 100,000, K <= N/2
APIO 2007 Backup • 如图最优解为连接1-2,3-4,总长为4
APIO 2007 Backup • 容易发现,选的边一定不会互相覆盖,即对于四个点a<b<c<d,若要求选两条边,则(a-c, b-d)必定不是最优解,因为显然(a-b, c-d)更优。 • 进一步地,选择的楼必定两两相邻 • DP?
APIO 2007 Backup • 用opt[n][k]表示前n个点中选出k条边的最优解,则有方程 opt[n][k] = min(opt[n-1][k], opt[n-2][k-1] + pos[n] - pos[n-1]) O(NK) TLE…
APIO 2007 Backup • 贪心? • 每次选最短的两楼相连? • 很容易举出反例 • (1,3,4,6,100) • ……
APIO 2007 Backup • 贪心真的无效么? • 仔细观察各种反例…… • 出现错误的地方在于,贪心选择的解无法“退回”,则下一步的最优解往往恰恰是上一步交替“取反”而得…… 交错路! 匹配!
APIO 2007 Backup • 图论模型—— • 把点按奇偶分为X集和Y集,问题即变为求含K条边的最小权匹配 • KM? ——不合适 • 考虑求最小费用路的最短增广路算法 • 每次选择最短路增广,共增广K次…… 这样能比DP更快?? @@
APIO 2007 Backup • 两个基本操作 • 选最短路 • 增广 • 回到线性模型—— • 可增广路一定是这样连续的一段 [不选,选,不选,选,不选]… • 我们把这样的一段当做一个元素
APIO 2007 Backup • 把每个区间当作一个元素 • 初始时,全部为[i,i]类型,权值为长度 • 用相应数据结构(堆或者平衡树)维护 • 每次选择权值最小的一个元素(设权为v) • 增广后,将其与其左右相邻的元素(设权为v1,v2)合并,新的权值变为(v1+v2-v) • 复杂度O(klogn)
SPOJ COVER • 给N个点,每个点都有一个权值,某些点之间存在有向边,有向边的权值为它的两端点权值之和。现在要求从中选出K条边,使得没有任何两条边共头或共尾,问K条边的权值和最小为多少。 • N<=10^4,边数M<=10^6,K<=100。
SPOJ COVER • 匹配? • 把每个点x拆成左右两个点(x1,x2),对原图中的边(x->y),新图中添边(x1-y2) • 则新图的一个匹配对应原图中的一种选法 • 二分图没有边共点 <-> 原图没有边共头共尾
SPOJ COVER • 现在只要求选出K条边 • 转成最小费用流?用最短增广路求K次? 复杂度O(MNK)…
SPOJ COVER • 贪心初始流,然后进行调整? • 我们没有利用到这个条件—— • 有向边的权值为它的两端点权值之和 • 如何利用?
SPOJ COVER • 实际上可以发现,对一条增广路的增广,就是加上该路两端的两个未配点的权值。 • 故寻找最小费用路变为寻找最小权值和的未配点对(xi,yj)
SPOJ COVER • 每次增广时,从左边选一个未配点xi,进行BFS/DFS找交错路,找到右边所有符合条件的未配点yj,则可以得出所有候选点对。 • 从每点BFS复杂度为O(M),每次要检验O(N)个左侧未配点,增广K次…… • 复杂度仍然O(MNK)?
SPOJ COVER • 实际上,预先给左侧点排序,按照权值的递增序依次检查未配点,则无须对每个点都重新找增广路,直接遍历一次即可。 • 若在以某点为起点找增广路时发现以前已经走过的点,则以前的点一定有更小的权值(因为未配点已按权值排序),故可以忽略。 • 总的复杂度O((M+N)K)