1 / 44

何亮 roba269@gmail

杂题. 何亮 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]

essien
Download Presentation

何亮 roba269@gmail

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 杂题 何亮 roba269@gmail.com

  2. 最大内空凸多边形 • TOJ 1495 The Picnic

  3. 最大内空凸多边形 • 首先把全部点排水平序,依次枚举,作为凸包的左下角的点(设为点p)。 • 保留在点p右方及上方的点,将这些点按极角序排列 • 按照此极角序DP…

  4. 最大内空凸多边形 • 用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)

  5. CEOI 2008 Fence • 平面上的某些点上有树,另一些点上有预先挖好的洞。我们需要买一些木桩插在某些洞里,然后绕着木桩围上篱笆,使得围住一部分树木。 • 每棵木桩费用为20,篱笆无费用。如果某树没有被围住,则它会丢失,每丢一棵树成本为111。 • 故若买P个木桩,丢K棵树,总花费为20P+111K。求一个花费最小的方案。

  6. CEOI 2008 Fence • 输入数据为树木和洞的位置,数量都<=100

  7. CEOI 2008 Fence • 几点观察: • 最多只需围一个凸包 • 即使花费三个木桩围住一棵树也是值得的 • 故我们要首先保证围住尽可能多的树,然后再想办法减少不必要的木桩

  8. 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)

  9. CEOI 2008 Knights • 国际象棋棋盘上有N个马,马只能向四个方向移动,且不能走出边界。两人轮流走,每人每次必须把所有可移动的马都按照规则移动一步。不能继续移动的人判负。问胜负情况,以及若先手胜,先手的第一步应如何走。 • 多个马可以在同一位置 • 棋盘大小K<=200,000, N <= 1,000,000

  10. 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

  11. 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 …

  12. CEOI 2008 Knights • 可以把每个马看作单独的Nim游戏,利用S-G函数求解吗? • 因为要求每次必须对所有马都走一步,所以不行…… • 换个角度,若所有马都在必败格,则先手必败;若有一个马在必胜格上呢?

  13. CEOI 2008 Knights • 实际上,先手方应采取的策略是 • 若马在必胜格,则尽可能地“拖延时间”(当然,要保证仍握有主动权) • 若马在必败格,则尽可能快地将其走死

  14. 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

  15. CEOI 2008 Knights • 则,若存在在必胜格p上的马的m(p)大于所有必败格上的马,则必胜 • DP? 对如此大范围可以出解? • 暴力生成表…

  16. 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

  17. CEOI 2008 Knights • 注意边界…… • Solution by rng_58 @ Topcoder

  18. CEOI 2008 Order • 给定一些任务,每个任务需要某些机器来完成,完成每个任务可以有相应的收益。机器可以买也可以租。不同的机器有不同的价格,不同的机器对不同的任务分别有不同的租金。机器只需买一次就可以无限使用,如果租机器则只能用在当前这次。 • 求最大的收益。 • 机器数<=1200, 任务数<=1200

  19. CEOI 2008 Order

  20. NOI 2006 Profit • 复习一个简化版问题——NOI 2006 Profit • 每个用户群Ci需要两个中转站ai和bi,已知建造每个中转站的花费以及为每个用户群服务所得收入。求总利润的最大值。 • 总利润 = 收入 - 花费

  21. NOI 2006 Profit • 新加S,T,对S和用户群连边,容量为该用户群的收益,对通讯站和T连边,容量为该通讯站的花费。对用户群和其所需通讯站连边,容易为正无穷。 • 此网络的一个割对应一种方案: S一侧的割集,表示不为其提供服务的用户群和需要建立的通讯站。

  22. NOI 2006 Profit 1 1 2 S集中的点为选择服务的用户群及修建的通讯站 S 2 T 3 3 用户群 4 通讯站

  23. CEOI 2008 Order • 回到原题,CEOI此题的不同之处是,允许出现“租”的情况 • 中间边的容量不为无穷大?

  24. CEOI 2008 Order • 割与方案仍然对应 • S集中的点表示要完成的任务以及要买的机器 • 若任务在S集,所需机器在T集,租金a则计入割的容量中 • 若任务不在S集,“浪费”的收益b计入割容量 • 若机器在S集,买机器花费c计入割的容量 • 总花费为三部分之和,净利润为所有任务的收益增去总的花费。求最小割,即使得a+b+c最小,也即净利润最大。

  25. CEOI 2008 Information • 给定有向图及其中一点r,求两棵以r为根,无公共边的“树型图”,使得其边权值总和最小 • 点数N <= 2,000, 边数M <= 1,000,000 • …

  26. CEOI 2008 Dominance • W*H的格子里有两种细菌,给出每个细菌的位置和感染范围。当某个格子m个A细菌和n个B细菌感染时,若m>n,我们说此格子被A支配了,若m<n,则此格被B支配。 • 现要求出分别被两种细菌支配的格子数 • W,H<=109, 细菌数N <= 3000

  27. APIO 2007 Backup • 给定直线上的N个楼,现有K条网线,要求给其中的2K个楼两两配对,使得网线的总长度尽可能小。 • N <= 100,000, K <= N/2

  28. APIO 2007 Backup • 如图最优解为连接1-2,3-4,总长为4

  29. APIO 2007 Backup • 容易发现,选的边一定不会互相覆盖,即对于四个点a<b<c<d,若要求选两条边,则(a-c, b-d)必定不是最优解,因为显然(a-b, c-d)更优。 • 进一步地,选择的楼必定两两相邻 • DP?

  30. 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…

  31. APIO 2007 Backup • 贪心? • 每次选最短的两楼相连? • 很容易举出反例 • (1,3,4,6,100) • ……

  32. APIO 2007 Backup • 贪心真的无效么? • 仔细观察各种反例…… • 出现错误的地方在于,贪心选择的解无法“退回”,则下一步的最优解往往恰恰是上一步交替“取反”而得…… 交错路! 匹配!

  33. APIO 2007 Backup • 图论模型—— • 把点按奇偶分为X集和Y集,问题即变为求含K条边的最小权匹配 • KM? ——不合适 • 考虑求最小费用路的最短增广路算法 • 每次选择最短路增广,共增广K次…… 这样能比DP更快?? @@

  34. APIO 2007 Backup • 两个基本操作 • 选最短路 • 增广 • 回到线性模型—— • 可增广路一定是这样连续的一段 [不选,选,不选,选,不选]… • 我们把这样的一段当做一个元素

  35. APIO 2007 Backup • 把每个区间当作一个元素 • 初始时,全部为[i,i]类型,权值为长度 • 用相应数据结构(堆或者平衡树)维护 • 每次选择权值最小的一个元素(设权为v) • 增广后,将其与其左右相邻的元素(设权为v1,v2)合并,新的权值变为(v1+v2-v) • 复杂度O(klogn)

  36. SPOJ COVER • 给N个点,每个点都有一个权值,某些点之间存在有向边,有向边的权值为它的两端点权值之和。现在要求从中选出K条边,使得没有任何两条边共头或共尾,问K条边的权值和最小为多少。 • N<=10^4,边数M<=10^6,K<=100。

  37. SPOJ COVER • 匹配? • 把每个点x拆成左右两个点(x1,x2),对原图中的边(x->y),新图中添边(x1-y2) • 则新图的一个匹配对应原图中的一种选法 • 二分图没有边共点 <-> 原图没有边共头共尾

  38. SPOJ COVER • 现在只要求选出K条边 • 转成最小费用流?用最短增广路求K次? 复杂度O(MNK)…

  39. SPOJ COVER • 贪心初始流,然后进行调整? • 我们没有利用到这个条件—— • 有向边的权值为它的两端点权值之和 • 如何利用?

  40. SPOJ COVER • 实际上可以发现,对一条增广路的增广,就是加上该路两端的两个未配点的权值。 • 故寻找最小费用路变为寻找最小权值和的未配点对(xi,yj)

  41. SPOJ COVER • 每次增广时,从左边选一个未配点xi,进行BFS/DFS找交错路,找到右边所有符合条件的未配点yj,则可以得出所有候选点对。 • 从每点BFS复杂度为O(M),每次要检验O(N)个左侧未配点,增广K次…… • 复杂度仍然O(MNK)?

  42. SPOJ COVER • 实际上,预先给左侧点排序,按照权值的递增序依次检查未配点,则无须对每个点都重新找增广路,直接遍历一次即可。 • 若在以某点为起点找增广路时发现以前已经走过的点,则以前的点一定有更小的权值(因为未配点已按权值排序),故可以忽略。 • 总的复杂度O((M+N)K)

More Related