更上一层楼

24
更更 更更 更更

description

更上一层楼. 郑曌. 郑曌 bbsID : superzz 2009-2010( Rhodea ) World Final Champion Ningbo, Champion Tokyo, 2 nd. Always an integer. Always an integer [world final 2008] 给定一个多项式 P ( x ), 给定一个整数 D , 判断 P ( x ) 是否恒为 D 的倍数. P ( x ) 的最高 此项 ≤ 100 . Sample - PowerPoint PPT Presentation

Transcript of 更上一层楼

Page 1: 更上一层楼

更上一层楼

郑曌

Page 2: 更上一层楼

郑曌bbsID: superzz

2009-2010(Rhodea) World Final Champion Ningbo, Champion Tokyo, 2nd

Page 3: 更上一层楼

ALWAYS AN INTEGER

Always an integer [world final 2008]给定一个多项式 P(x), 给定一个整数 D, 判断

P(x) 是否恒为 D 的倍数.P(x) 的最高此项 ≤ 100 .

SampleP(x) = x2 + x, D = 2 .

ANS = Yes

x 0 1 2 3 4 5 6 7 8

P(x)

0 2 6 12 20 30 42 56 72

Page 4: 更上一层楼

ALWAYS AN INTEGER

解法:不完全归纳法1. 随机取 x 的值2. 计算 P(x) 的值3. 如果 P(x) 不是 D 的倍数,则 ANS = No ,结束。 4. 继续执行上述 3 步,直到尝试了足够多的 x 取值。

思考: 1 ,对于给定的 x ,如何计算 P(x) 2, 如何定义取到足够多 x 值 3 ,算法效率如何

Page 5: 更上一层楼

ALWAYS AN INTEGER

应该随机选取多少个 x 进行测试? Sample P(x) = x2 + x, D = 2 .

结论: 设 P(x) 的最高项次数为 k, 那么经过 k 次相邻两个数相

减的操作后 , 序列变成了一个常数序列 , 只需要判断最后常数项 C 是否为 D 的倍数即可.列举序列中的 x = 0 .. k 的 k+1 项即可.

时间复杂度为 O(k2) .

x 0 1 2 3 4 5 6 7 8

P(x) 0 2 6 12 20 30 42 56 72

2 4 6 8 10 12 14 16

2 2 2 2 2 2 2

Page 6: 更上一层楼

ALWAYS AN INTEGER

本质:差分方程 http://en.wikipedia.org/wiki/

Difference_equation 简单的想法:

一个最高次项为 k 的多项式 f(x) ,则方程 f(x)=0 的根有 k 个。 反过来说, k 个不同的值 (x1,x2,…xk) 可以唯一确定一个多项式

f(x) 。 f(x) = (x-x1)*(x-x2)*..(x-xk)

Any question?

Page 7: 更上一层楼

STEAM ROLLER

Steam Roller [world final 2008]

有一个 r * c 的矩阵 , 对于相邻的两个点 , 从其中的一个点到达另一个点有一个权值. 现在要求从 (r1, c1) 到达(r2, c2), 路线是由若干条水平和垂直的路径连接组成 , 每次可以从一个点往上下左右中的一个方向前进若干步 , 其中第一条边和最后一条边的权值要计算 2 次 , 中间的边的权值只计算一次.求 (r1, c1) 到 (r2, c2) 的最短路.

1 ≤ r, c ≤ 100 .

Page 8: 更上一层楼

STEAM ROLLER

Sample

Page 9: 更上一层楼

STEAM ROLLER

Sample

紫色路径为权值需要双倍计算的路径。 Red Line = (9 * 2) * 6 = 118 Blue Line = (10 * 2) * 4 + (10 * 1) * 2 = 100

Page 10: 更上一层楼

STEAM ROLLER

状态抽象: 对于每个点 (i, j) 拆成 8 个点:分别表示上一步从上下左

右的哪个方向移动到这个点 . 以及移动到这个点的这条边的权值是否已加倍.

对于状态 (i, j, direction, double) 枚举下一步移动的方向 , 考虑当前的方向与上一步方向是否一致以及 k 来决定最后一条边是否需要加倍.

对这 r * c * 8 个点求最短路。

Page 11: 更上一层楼

STEAM ROLLER

Trick:

一个点可能先往左移动若干步后又往右移动 , 因为权值加倍的限制 , 这样可能比直接往左移动到那个点的权值之和要小 , 上下方向也是类似的.

即使走到了终点 (r2, c2) 路线也不一定结束 , 可能走到(r2, c2) 再往前移动一格后回退一格 , 使得走到 (r2, c2)的那条边不用加倍而权值之和更小.

Page 12: 更上一层楼

EYEBALL BENDERS

Eyeball Benders [world final 2005]给出由水平或垂直线段组成的两幅图,判断第

一幅是否由第二幅图局部放大得到。保证至少有一个端点同时出现在两幅图中。

Page 13: 更上一层楼

EYEBALL BENDERS

Page 14: 更上一层楼

EYEBALL BENDERS

思路 枚举两个图中都出现的顶点,确立放缩比例,放缩之后

判断两个图形是否全等。

Page 15: 更上一层楼

ESCAPE

Escape (from matrix67)给定一个不超过 2000*2000 的网格,你在

最左下角的位置(即 (0,0) 点),你的目的地在(x,y) 。

要求你的路线不得经过同一个交叉点两次,且 不允许左转(题目背景让这个条件顺理成章:街道靠右行,左转不方便)

问合法的路线共有多少种。

Page 16: 更上一层楼

ESCAPE

Page 17: 更上一层楼

ESCAPE

思路:街道的选取唯一地决定了整个路线。假设计算转弯恰好 11 次的路线有多少条。这样

的路线一定含有三条向上走的路、三条向右走的路、三条向下走的路 和三条向左走的路。

除去第一条路和最后一条路的位置都是确定的,其它的路选在哪一行或者哪一列唯一地决定了整个路线。

Page 18: 更上一层楼

ESCAPE

排列组合?向上走的路是 C(5,2) ,向右走的路是

C(7,3) ,向下走的路是 C(4,3) ,向左走的路是C(3,2) 。把它们各自的选取方案数乘起来就得到了拐弯 11 次的合法路径。

计算所有的路线数只需要从小到大枚举拐弯的次数,每一次计算都是常数复杂度的。

Page 19: 更上一层楼

SHORTEST PATH

Shortest path (from matrix67)给定一个非负有向图,你有 k 次机会将某条

边的权值减半,给定 s,t 。求 s 到 t 的最短路。

Page 20: 更上一层楼

SHORTEST PATH K=0

求 s 到 t 的最短路。 (Dijkstra, Bellman-ford, Floyed)

K=1

求出任意两点间最短路。枚举一条边 (u,v) 。求 min_dist(s,u) + w(u,v) / 2 + min_dist(u, t)

Page 21: 更上一层楼

SHORTEST PATH

K>1 把原图分成 k+1层,从 0 到 k 分别标号。

上面的层到下面的层有很多单向边,每条边都和原图上的某条边相对应,跨越了几层权值就打几次对折,表示我“走了一 条权值减过的边”。

因此,你当前走在第几层,就表示你已经用掉了几次减半机会。在这个有 O(nk) 个顶点的图上做最短路,其结果就是我们所要求的。

Page 22: 更上一层楼

SHORTEST PATH

K>1

Page 24: 更上一层楼

Thanks