更上一层楼
-
Upload
mallory-flores -
Category
Documents
-
view
37 -
download
10
description
Transcript of 更上一层楼
更上一层楼
郑曌
郑曌bbsID: superzz
2009-2010(Rhodea) World Final Champion Ningbo, Champion Tokyo, 2nd
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
ALWAYS AN INTEGER
解法:不完全归纳法1. 随机取 x 的值2. 计算 P(x) 的值3. 如果 P(x) 不是 D 的倍数,则 ANS = No ,结束。 4. 继续执行上述 3 步,直到尝试了足够多的 x 取值。
思考: 1 ,对于给定的 x ,如何计算 P(x) 2, 如何定义取到足够多 x 值 3 ,算法效率如何
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
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?
STEAM ROLLER
Steam Roller [world final 2008]
有一个 r * c 的矩阵 , 对于相邻的两个点 , 从其中的一个点到达另一个点有一个权值. 现在要求从 (r1, c1) 到达(r2, c2), 路线是由若干条水平和垂直的路径连接组成 , 每次可以从一个点往上下左右中的一个方向前进若干步 , 其中第一条边和最后一条边的权值要计算 2 次 , 中间的边的权值只计算一次.求 (r1, c1) 到 (r2, c2) 的最短路.
1 ≤ r, c ≤ 100 .
STEAM ROLLER
Sample
STEAM ROLLER
Sample
紫色路径为权值需要双倍计算的路径。 Red Line = (9 * 2) * 6 = 118 Blue Line = (10 * 2) * 4 + (10 * 1) * 2 = 100
STEAM ROLLER
状态抽象: 对于每个点 (i, j) 拆成 8 个点:分别表示上一步从上下左
右的哪个方向移动到这个点 . 以及移动到这个点的这条边的权值是否已加倍.
对于状态 (i, j, direction, double) 枚举下一步移动的方向 , 考虑当前的方向与上一步方向是否一致以及 k 来决定最后一条边是否需要加倍.
对这 r * c * 8 个点求最短路。
STEAM ROLLER
Trick:
一个点可能先往左移动若干步后又往右移动 , 因为权值加倍的限制 , 这样可能比直接往左移动到那个点的权值之和要小 , 上下方向也是类似的.
即使走到了终点 (r2, c2) 路线也不一定结束 , 可能走到(r2, c2) 再往前移动一格后回退一格 , 使得走到 (r2, c2)的那条边不用加倍而权值之和更小.
EYEBALL BENDERS
Eyeball Benders [world final 2005]给出由水平或垂直线段组成的两幅图,判断第
一幅是否由第二幅图局部放大得到。保证至少有一个端点同时出现在两幅图中。
EYEBALL BENDERS
EYEBALL BENDERS
思路 枚举两个图中都出现的顶点,确立放缩比例,放缩之后
判断两个图形是否全等。
ESCAPE
Escape (from matrix67)给定一个不超过 2000*2000 的网格,你在
最左下角的位置(即 (0,0) 点),你的目的地在(x,y) 。
要求你的路线不得经过同一个交叉点两次,且 不允许左转(题目背景让这个条件顺理成章:街道靠右行,左转不方便)
问合法的路线共有多少种。
ESCAPE
ESCAPE
思路:街道的选取唯一地决定了整个路线。假设计算转弯恰好 11 次的路线有多少条。这样
的路线一定含有三条向上走的路、三条向右走的路、三条向下走的路 和三条向左走的路。
除去第一条路和最后一条路的位置都是确定的,其它的路选在哪一行或者哪一列唯一地决定了整个路线。
ESCAPE
排列组合?向上走的路是 C(5,2) ,向右走的路是
C(7,3) ,向下走的路是 C(4,3) ,向左走的路是C(3,2) 。把它们各自的选取方案数乘起来就得到了拐弯 11 次的合法路径。
计算所有的路线数只需要从小到大枚举拐弯的次数,每一次计算都是常数复杂度的。
SHORTEST PATH
Shortest path (from matrix67)给定一个非负有向图,你有 k 次机会将某条
边的权值减半,给定 s,t 。求 s 到 t 的最短路。
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)
SHORTEST PATH
K>1 把原图分成 k+1层,从 0 到 k 分别标号。
上面的层到下面的层有很多单向边,每条边都和原图上的某条边相对应,跨越了几层权值就打几次对折,表示我“走了一 条权值减过的边”。
因此,你当前走在第几层,就表示你已经用掉了几次减半机会。在这个有 O(nk) 个顶点的图上做最短路,其结果就是我们所要求的。
SHORTEST PATH
K>1
EXERCISE
http://acmicpc-live-archive.uva.es/nuevoportal/data/problem.php?p=4787
http://acmicpc-live-archive.uva.es/nuevoportal/data/problem.php?p=4791
http://acmicpc-live-archive.uva.es/nuevoportal/data/problem.php?p=4794
http://acm.pku.edu.cn/JudgeOnline/problem?id=3318
Thanks