何亮 roba269@gmail

44
1 杂杂 杂杂 [email protected]

Upload: essien

Post on 20-Jan-2016

142 views

Category:

Documents


0 download

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 k

TRANSCRIPT

Page 1: 何亮 roba269@gmail

1

杂题

何亮[email protected]

Page 2: 何亮 roba269@gmail

2

最大内空凸多边形

TOJ 1495 The Picnic

Page 3: 何亮 roba269@gmail

3

最大内空凸多边形

首先把全部点排水平序,依次枚举,作为凸包的左下角的点(设为点 p )。

保留在点 p 右方及上方的点,将这些点按极角序排列

按照此极角序 DP…

Page 4: 何亮 roba269@gmail

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)

Page 5: 何亮 roba269@gmail

5

CEOI 2008 Fence

平面上的某些点上有树,另一些点上有预先挖好的洞。我们需要买一些木桩插在某些洞里,然后绕着木桩围上篱笆,使得围住一部分树木。

每棵木桩费用为 20 ,篱笆无费用。如果某树没有被围住,则它会丢失,每丢一棵树成本为 111 。

故若买 P 个木桩,丢 K 棵树,总花费为 20P+111K 。求一个花费最小的方案。

Page 6: 何亮 roba269@gmail

6

CEOI 2008 Fence

输入数据为树木和洞的位置,数量都 <=100

Page 7: 何亮 roba269@gmail

7

CEOI 2008 Fence

几点观察:最多只需围一个凸包即使花费三个木桩围住一棵树也是值得的

故我们要首先保证围住尽可能多的树,然后再想办法减少不必要的木桩

Page 8: 何亮 roba269@gmail

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)

Page 9: 何亮 roba269@gmail

9

CEOI 2008 Knights

国际象棋棋盘上有 N 个马,马只能向四个方向移动,且不能走出边界。两人轮流走,每人每次必须把所有可移动的马都按照规则移动一步。不能继续移动的人判负。问胜负情况,以及若先手胜,先手的第一步应如何走。

多个马可以在同一位置棋盘大小 K<=200,000, N <= 1,000,000

Page 10: 何亮 roba269@gmail

10

CEOI 2008 Knights

Input2 32 33 2

OutputYES1 11 1

•Input

3 4

2 3

3 2

4 4

•Output

No

Page 11: 何亮 roba269@gmail

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 …

Page 12: 何亮 roba269@gmail

12

CEOI 2008 Knights

可以把每个马看作单独的 Nim 游戏,利用 S-G 函数求解吗 ?

因为要求每次必须对所有马都走一步,所以不行……

换个角度,若所有马都在必败格,则先手必败;若有一个马在必胜格上呢?

Page 13: 何亮 roba269@gmail

13

CEOI 2008 Knights

实际上,先手方应采取的策略是若马在必胜格,则尽可能地“拖延时间”

( 当然,要保证仍握有主动权 )若马在必败格,则尽可能快地将其走死

Page 14: 何亮 roba269@gmail

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

Page 15: 何亮 roba269@gmail

15

CEOI 2008 Knights

则,若存在在必胜格 p 上的马的 m(p) 大于所有必败格上的马,则必胜

DP? 对如此大范围可以出解 ?

暴力生成表…

Page 16: 何亮 roba269@gmail

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

Page 17: 何亮 roba269@gmail

17

CEOI 2008 Knights

注意边界…… Solution by rng_58 @ Topcoder

ceoi_knight.cpp

Page 18: 何亮 roba269@gmail

18

CEOI 2008 Order

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

求最大的收益。机器数 <=1200, 任务数 <=1200

Page 19: 何亮 roba269@gmail

19

CEOI 2008 Order

Page 20: 何亮 roba269@gmail

20

NOI 2006 Profit

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

Page 21: 何亮 roba269@gmail

21

NOI 2006 Profit

新加 S,T ,对 S 和用户群连边,容量为该用户群的收益,对通讯站和 T 连边,容量为该通讯站的花费。对用户群和其所需通讯站连边,容易为正无穷。

此网络的一个割对应一种方案: S 一侧的割集,表示不为其提供服务的用户群和需要建立的通讯站。

Page 22: 何亮 roba269@gmail

22

NOI 2006 Profit

1

2

3

1

S

2

T

4

3

用户群

通讯站

S 集中的点为选择服务的用户群及修建的通讯站

Page 23: 何亮 roba269@gmail

23

CEOI 2008 Order

回到原题, CEOI 此题的不同之处是,允许出现“租”的情况

中间边的容量不为无穷大?

Page 24: 何亮 roba269@gmail

24

CEOI 2008 Order

割与方案仍然对应S 集中的点表示要完成的任务以及要买的机器若任务在 S 集,所需机器在 T 集,租金 a 则计

入割的容量中若任务不在 S 集,“浪费”的收益 b计入割容

量若机器在 S 集,买机器花费 c计入割的容量

总花费为三部分之和,净利润为所有任务的收益增去总的花费。求最小割,即使得 a+b+c 最小,也即净利润最大。

Page 25: 何亮 roba269@gmail

25

CEOI 2008 Information

给定有向图及其中一点 r,求两棵以 r为根,无公共边的“树型图”,使得其边权值总和最小

点数 N <= 2,000, 边数 M <= 1,000,000…

Page 26: 何亮 roba269@gmail

26

CEOI 2008 Dominance

W*H 的格子里有两种细菌,给出每个细菌的位置和感染范围。当某个格子m 个A细菌和 n 个 B细菌感染时,若 m>n ,我们说此格子被 A支配了,若 m<n ,则此格被 B支配。

现要求出分别被两种细菌支配的格子数W,H<=109, 细菌数 N <= 3000

Page 27: 何亮 roba269@gmail

27

Page 28: 何亮 roba269@gmail

28

APIO 2007 Backup

给定直线上的 N 个楼,现有 K条网线,要求给其中的 2K 个楼两两配对,使得网线的总长度尽可能小。

N <= 100,000, K <= N/2

Page 29: 何亮 roba269@gmail

29

APIO 2007 Backup

如图最优解为连接 1-2 , 3-4 ,总长为 4

Page 30: 何亮 roba269@gmail

30

APIO 2007 Backup

容易发现,选的边一定不会互相覆盖,即对于四个点 a<b<c<d ,若要求选两条边,则 (a-c, b-d) 必定不是最优解,因为显然(a-b, c-d)更优。

进一步地,选择的楼必定两两相邻

DP?

Page 31: 何亮 roba269@gmail

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…

Page 32: 何亮 roba269@gmail

32

APIO 2007 Backup

贪心?每次选最短的两楼相连?

很容易举出反例(1,3,4,6,100)……

Page 33: 何亮 roba269@gmail

33

APIO 2007 Backup

贪心真的无效么?仔细观察各种反例……出现错误的地方在于,贪心选择的解无法

“退回”,则下一步的最优解往往恰恰是上一步交替“取反”而得……

交错路! 匹配!

Page 34: 何亮 roba269@gmail

34

APIO 2007 Backup

图论模型——把点按奇偶分为 X 集和 Y 集,问题即变为求含 K条边的最小权匹配

KM? —— 不合适考虑求最小费用路的最短增广路算法

每次选择最短路增广,共增广 K 次……

这样能比 DP更快 ?? @@

Page 35: 何亮 roba269@gmail

35

APIO 2007 Backup

两个基本操作选最短路增广

回到线性模型——可增广路一定是这样连续的一段

[ 不选 ,选 , 不选 ,选 , 不选 ]…我们把这样的一段当做一个元素

Page 36: 何亮 roba269@gmail

36

APIO 2007 Backup

把每个区间当作一个元素初始时,全部为 [i,i]类型,权值为长度用相应数据结构 (堆或者平衡树 )维护

每次选择权值最小的一个元素 ( 设权为 v)增广后,将其与其左右相邻的元素 ( 设权为 v

1,v2) 合并,新的权值变为 (v1+v2-v)复杂度 O(klogn)

Page 37: 何亮 roba269@gmail

37

SPOJ COVER

给 N 个点,每个点都有一个权值,某些点之间存在有向边,有向边的权值为它的两端点权值之和。现在要求从中选出 K条边,使得没有任何两条边共头或共尾,问K条边的权值和最小为多少。

N<=10^4 ,边数 M<=10^6 , K<=100 。

Page 38: 何亮 roba269@gmail

38

SPOJ COVER

匹配 ?把每个点 x拆成左右两个点 (x1,x2) ,对原图中的边 (x->y) ,新图中添边 (x1-y2)

则新图的一个匹配对应原图中的一种选法二分图没有边共点 <-> 原图没有边共头共尾

Page 39: 何亮 roba269@gmail

39

SPOJ COVER

现在只要求选出 K条边转成最小费用流?用最短增广路求 K 次?

复杂度 O(MNK)…

Page 40: 何亮 roba269@gmail

40

SPOJ COVER

• 贪心初始流,然后进行调整 ?

我们没有利用到这个条件——有向边的权值为它的两端点权值之和

如何利用 ?

Page 41: 何亮 roba269@gmail

41

SPOJ COVER

实际上可以发现,对一条增广路的增广,就是加上该路两端的两个未配点的权值。

故寻找最小费用路变为寻找最小权值和的未配点对 (xi,yj)

Page 42: 何亮 roba269@gmail

42

SPOJ COVER

每次增广时,从左边选一个未配点 xi ,进行 BFS/DFS 找交错路,找到右边所有符合条件的未配点 yj ,则可以得出所有候选点对。

从每点 BFS 复杂度为 O(M) ,每次要检验O(N) 个左侧未配点,增广 K 次……

复杂度仍然 O(MNK)?

Page 43: 何亮 roba269@gmail

43

SPOJ COVER

实际上,预先给左侧点排序,按照权值的递增序依次检查未配点,则无须对每个点都重新找增广路,直接遍历一次即可。若在以某点为起点找增广路时发现以前已经

走过的点,则以前的点一定有更小的权值( 因为未配点已按权值排序 ) ,故可以忽略。

总的复杂度 O((M+N)K)

Page 44: 何亮 roba269@gmail

44