何亮 roba269@gmail
DESCRIPTION
杂题. 何亮 [email protected]. 最大内空凸多边形. 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 kTRANSCRIPT
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
Input2 32 33 2
OutputYES1 11 1
•Input
3 4
2 3
3 2
4 4
•Output
No
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
ceoi_knight.cpp
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
2
3
1
S
2
T
4
3
用户群
通讯站
S 集中的点为选择服务的用户群及修建的通讯站
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
28
APIO 2007 Backup
给定直线上的 N 个楼,现有 K条网线,要求给其中的 2K 个楼两两配对,使得网线的总长度尽可能小。
N <= 100,000, K <= N/2
29
APIO 2007 Backup
如图最优解为连接 1-2 , 3-4 ,总长为 4
30
APIO 2007 Backup
容易发现,选的边一定不会互相覆盖,即对于四个点 a<b<c<d ,若要求选两条边,则 (a-c, b-d) 必定不是最优解,因为显然(a-b, c-d)更优。
进一步地,选择的楼必定两两相邻
DP?
31
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…
32
APIO 2007 Backup
贪心?每次选最短的两楼相连?
很容易举出反例(1,3,4,6,100)……
33
APIO 2007 Backup
贪心真的无效么?仔细观察各种反例……出现错误的地方在于,贪心选择的解无法
“退回”,则下一步的最优解往往恰恰是上一步交替“取反”而得……
交错路! 匹配!
34
APIO 2007 Backup
图论模型——把点按奇偶分为 X 集和 Y 集,问题即变为求含 K条边的最小权匹配
KM? —— 不合适考虑求最小费用路的最短增广路算法
每次选择最短路增广,共增广 K 次……
这样能比 DP更快 ?? @@
35
APIO 2007 Backup
两个基本操作选最短路增广
回到线性模型——可增广路一定是这样连续的一段
[ 不选 ,选 , 不选 ,选 , 不选 ]…我们把这样的一段当做一个元素
36
APIO 2007 Backup
把每个区间当作一个元素初始时,全部为 [i,i]类型,权值为长度用相应数据结构 (堆或者平衡树 )维护
每次选择权值最小的一个元素 ( 设权为 v)增广后,将其与其左右相邻的元素 ( 设权为 v
1,v2) 合并,新的权值变为 (v1+v2-v)复杂度 O(klogn)
37
SPOJ COVER
给 N 个点,每个点都有一个权值,某些点之间存在有向边,有向边的权值为它的两端点权值之和。现在要求从中选出 K条边,使得没有任何两条边共头或共尾,问K条边的权值和最小为多少。
N<=10^4 ,边数 M<=10^6 , K<=100 。
38
SPOJ COVER
匹配 ?把每个点 x拆成左右两个点 (x1,x2) ,对原图中的边 (x->y) ,新图中添边 (x1-y2)
则新图的一个匹配对应原图中的一种选法二分图没有边共点 <-> 原图没有边共头共尾
39
SPOJ COVER
现在只要求选出 K条边转成最小费用流?用最短增广路求 K 次?
复杂度 O(MNK)…
40
SPOJ COVER
• 贪心初始流,然后进行调整 ?
我们没有利用到这个条件——有向边的权值为它的两端点权值之和
如何利用 ?
41
SPOJ COVER
实际上可以发现,对一条增广路的增广,就是加上该路两端的两个未配点的权值。
故寻找最小费用路变为寻找最小权值和的未配点对 (xi,yj)
42
SPOJ COVER
每次增广时,从左边选一个未配点 xi ,进行 BFS/DFS 找交错路,找到右边所有符合条件的未配点 yj ,则可以得出所有候选点对。
从每点 BFS 复杂度为 O(M) ,每次要检验O(N) 个左侧未配点,增广 K 次……
复杂度仍然 O(MNK)?
43
SPOJ COVER
实际上,预先给左侧点排序,按照权值的递增序依次检查未配点,则无须对每个点都重新找增广路,直接遍历一次即可。若在以某点为起点找增广路时发现以前已经
走过的点,则以前的点一定有更小的权值( 因为未配点已按权值排序 ) ,故可以忽略。
总的复杂度 O((M+N)K)
44