某岛

… : "…アッカリ~ン . .. . " .. .
October 18, 2012

ACM-ICPC Regional Asia Beijing 2008

Overview:

。。常规套题。。除了 B 题以外都没什么好推荐的。。。。(B 题是非常经典的 Nim-like 问题。。必须总结整理。。。。
A 可以迭代加深搜索、也可以网络流。。
G 可以排序贪心、也可以 2-SAT。。
。另外像是 J 题这样子的蘑菇题。。处理起来必须要非常小心。。。
。。比赛的时候需要用这类题目来给三妹争取推 B 和 I 的时间。。。

Analysis:

Problem A. Destroying the bus stations
..有向图,问最少删去多少点,使得不存在 s 到 t 的长度 <=k 的路径。 (。不能删去 s、t。。不存在 s 直接到 t 的边。。。n ≤ 50。。。 。。因为 n 比较小所以可以裸搜。。。 。。一般问题可以网络流解决。(有向图点连通度)。。 。做法是对中间结点拆点。连一条容量为 1 的边。 。。之后从 s 出发各做一次单源最短路。(得到 d1[]。。。 、从 t 出发在转置图中做一次最短路。。(d2[]。。 。检查每条边 (u, v, w)。。如果 d1[u] + w + d2[v] <= k 。则连一条 u -> v’ 。。容量为 oo 的边。。求最小割。。

算法 1:
迭代加深搜索。。
算法 2:
最小割。

Problem B. A simple stone game
任何一个正整数都可以分解为某个类 Fibonacci 数列 {ai} 中。。
一个子序列 {aj} 的和。。且满足 k aj < aj+1 。 证明:(构造 。。。设 ri 为前 i 个 {ai} ,在满足性质 1 的情况下所能分解出的数字的最大值。 那么有。。 ai+1 = ri + 1。。(保证每个数字都可以出现。。 ri = ai + rj。。j 满足 aj * k < ai 且尽可能大。(保证分解方案唯一。。 —————————————————————— 这个题非常 Nice,思维流首先是对 k 做限制, 对于 k = 1、2 的情况不难发现解和数的二进制分解和 Fibonacci 分解有关。。。 关于 Fibonacci 唯一分解这个有必要在 Mark 一下。。 定理:任何一个正整数都可以分解为 Fibonacci 数列中一些不相邻的数的和,且分解方案唯一。 证明这个定理的方法和前面更一般的构造法类似,且 且 k = 2 恰好是 Fibonacci 数列,只是 k aj < aj+1 这个条件中 k = 2 情况下的特例。。 之后把观察了一下 k 比较小情况下的 {ai} .. .

1,2,4,8,16,32,64 .. .
1,2,3,5,8,13,21,34 .. .
1,2,3,4,6,8,11,15 .. .
1,2,3,4,5,7,9,12,15,19,24,31,40,52 .. .
1,2,3,4,5,6,7,8,10,12,15,18,22,27,33,41,51,63,78

k = 3 的时候是

A003411A003412 / A003413

对于之后的 k >=3 。。都是从数列的某项开始(哪项?。。
满足 a[n] = a[n-1] + a[n-k] 。。
(… 而开始前面的地方会偶尔向前震荡一下。 a[n] = a[n-1] + a[n-k+?]。。。
(… 似乎没什么规律。。。

博弈论、斐波那契数列、构造

Problem C. Ugly Windows
模拟。。

Problem D. Tornado
计算几何。。
固定一点,问题转换为单点到一组平行线段的最短距离,三分之。。
注意线段退化的情况。。。。

Problem E. Minimal Ratio Tree
暴力枚举,最小生成树。

Problem F.
单调队列,动态规划。。。

Problem G. Priest John’s Busiest Day
根据中间时刻排序贪心即可。(婚礼必然经过中间时刻。。注意仪式时间严格大于婚礼时间的一半。。
排序,贪心。。

Problem H. Ping pong
树状数组。。。

Problem I. Timer
二分答案 + 积分 =w=。。。

Problem J. Elevator
1 是如何讨论状态。。。
。。总之分 idle(空闲中)。。 anchor (停泊中) 。。open (开门中) 三种进行讨论。。
。。另外对于空闲状态。。记录当前移动的方向。。
(正确的讨论状态非常重要。。否则根本无法处理诸如。。先开门进来 3 个人。。这个时候又来了 1 个。。。再进来 1 个。。再关门。。关门的时候又来了一个。。再开门再进来一个这样的情况。。。)

2 处理请求的优先级问题。。
。。这里做了。。__c(), _c(), c0(), c1(), c2(), c3() 一组函数。。。
__c() 判断某个位置是否有人要上车。。
_c() 在 __c() 的基础上,再判断请求方向是否与电梯运行方向一致。
c0(), c1(), c2(), c3() 分别是是否有 上/下 方向的人需要 进/出。。。

。。然后做起来的话就要舒服多了。。
恶模拟。。

External link:

http://acm.hust.edu.cn:8080/judge/contest/view.action?cid=723#overview