240 likes | 393 Views
更上一层楼. 郑曌. 郑曌 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
E N D
更上一层楼 郑曌
郑曌 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. • Sample P(x) = x2 + x, D = 2. • ANS = Yes
Always an integer • 解法:不完全归纳法 • 随机取x的值 • 计算P(x)的值 • 如果P(x) 不是 D 的倍数,则ANS = No,结束。 • 继续执行上述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).
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 • 思路 • 枚举两个图中都出现的顶点,确立放缩比例,放缩之后判断两个图形是否全等。
Escape • Escape (from matrix67) 给定一个不超过2000*2000的网格,你在最左下角的位置(即(0,0)点),你的目的地在(x,y)。 要求你的路线不得经过同一个交叉点两次,且 不允许左转(题目背景让这个条件顺理成章:街道靠右行,左转不方便) 问合法的路线共有多少种。
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