Loading...

HNOI 2010 解题报告

July 5th, 2010 6 comments

由于题目的版权问题, 这里并不会出现题目描述, 请通过其他渠道获取题目描述.

合唱队 Chorus

很容易的区间DP, 设 F_{i, j}, G_{i, j} 分别表示当前状态为区间 [i, j], 最后一个放的元素在区间的左侧和右侧的方案数. 时间复杂度 O(n^2) .

平面图判定 Planar

判定存在 Hamilton 回路的平面图, 实际上就是判定能否把区间(边)分成两个集合, 使得每个集合内的元素互不相交(但可以严格包含).

这道题其实是有 O(nlogn) 的解法的, 但是这道题的点数过少, 也有很方便的解法. 根据欧拉定理, 平面图的边数 |e| 和点数 |v| 满足 |e| \leq 3|v| - 6. 那我们可以把边数的规模降低, 然后可以用 O(n^2) 的染色解决此题.

物品调度 Fsk

假设我们已经知道了终止状态, 如何求得最小步数呢. 我们可以用 O(n) 的时间求出这个置换的每个循环. 对于每个长度大于1的循环, 若其中含有0元素, 那么最少需 length - 1 步, 否则需要 length + 1 步.

现在的问题是如何求出终止状态, 观察题意发现, 每个元素的终止状态是放在  C_i~mod~gcd(n, d) 之后第一个非空的模 gcd(n, d) 剩余系中, 并且放在这个模 gcd(n, d) 剩余系中当前位置的下一个可行位置, 因此我们可以用链表/平衡树维护每个模 gcd(n, d) 剩余系的情况以及每个模 gcd(n, d) 剩余系内部的情况. 可以做到 O(n) 的复杂度.

公交线路 Bus

我们可以用每辆车到一个点的距离集合来表示一个状态, 由于不能有空位以及车之间没有区别, 实际状态集合的最多只有 C(9, 5) = 126 个之少.

我们可以用矩阵乘法来优化转移, 复杂度最多为 O(126^3 * logn).

取石子游戏 Stone

解法未知.

城市建设 City

解法未知.

弹飞绵羊 Bounce

首先这道题只能往后跳, 所以我们用块状链表维护每个点在块内和块外的情况即可用O(n\sqrt{n}) 的时间解决此题.

正解之一是利用括号序列, 每次操作都是把一棵子树砍下并且接在某个结点上, 那么我们可以维护括号序列整段移动来完成这个操作. 同时为了回答询问我们需要知道每个左括号的左边有几个未匹配的左括号, Splay 可以维护这个值, 时间复杂度 O(nlogn).

矩阵 Matrix

设给定的矩阵是 B, 原矩阵是 A, 另设 C 矩阵, 其中:

C 的第一行和第一列均是0, 且 C_{i, j}=B_{i, j} - C_{i - 1, j} - C_{i, j - 1} - C_{i - 1, j - 1}.

同时满足  A_{i, j} = C_{i, j} + (-1) ^ {i - 1} A_{1, j} + (-1) ^ {j - 1} A_{i, 1} + (-1) ^ {i + j - 1} A_{1, 1}. 证明在(外链打开请谨慎).

那么我们搜索 A 的第一行, 在枚举 A_{1, j} 时检查第 j 列并更新第一列的可行集合来剪枝. 这样就可以通过这道题了.

Categories: Informatics Tags: ,

关于日志清理

June 12th, 2010 No comments

从2005年在某 BSP 上写第一篇日志开始, 再到两年多前 cnPhil 建立, 在这上面发布过的日志什么类型的都有. 不过你会发现, cnPhil 越来越学术化. 同样, 在接下来的几个月当中, 会有很多学术性的专题日志出现在这里. 关于 cnPhil 未来的走向也是越来越明晰. 所以我发现, 现在有必要进行一次日志清理. 所有跟我个人有关的内容将会被清理到 phil.tw, 同样你可以关注我的 twitter. 今后这里只会发布学术性的日志.

Categories: Trivia Tags:

RIP, Martin Gardner

May 23rd, 2010 2 comments

Martin Gardner 先生於昨日(22日)去世了, 終年95歲.

95 = 0~(mod~1) =1~(mod~2) =2~(mod~3) =3~(mod~4)

這是一個很有趣的數, 他應該會很喜歡的.

Martin 先生最著名的成就便是在科學美國人上開設二十餘年的數學遊戲專欄, 下面這張很有名的數學謬論就是他提出來的:

你要是還想進一步了解他所作的謎題, 請移步科學美國人的紀念文章.

本文部分內容來自Three Sixty.

Categories: Brainstorm, General Math Tags:

海倫公式的非幾何證明

May 11th, 2010 2 comments

大家都知道海倫公式K=\sqrt{s(s - a)(s - b)(s - c)}, 其中s=\frac{a + b + c}{2}是半周長. 這一公式由於計算複雜所以在中學數學中並沒有被重視, 甚至由於容易造成精度誤差也沒有在信息學中應用. 現在我們要用盡量少的幾何知識來證明這個公式.

假設

我們假設K^2是一個關於a, b, c的4次齊次多項式, 我們已經知道(a + b - c)(a - b + c)(-a + b + c)能夠整除K^2, 那麼除後剩下來的是關於a, b, c的線性式子. 因此我們假設K^2 = K_0(a + b + c)(a + b - c)(a - b + c)(-a + b + c), 這裡K_0是一個常數. 我們把周長是1, 1, \sqrt{2}面積是\frac{1}{2}的三角形帶入計算, 得到:

\frac{1}{4}=2K_0(2+\sqrt{2})(2-\sqrt{2})=4K_0

因此得到K_0=\frac{1}{16}, 滿足條件.

驗證假設

K^2是顯然次數均勻且對稱的, 但它是不是一個多項式呢?

我們設h_{a}a邊上的高, 類似地對b, c也定義其高, 那麼K=\frac{h_{a}a}{2}, 那麼問題變成了a^2h_{a}^2是不是一個多項式, 根據Stewart’s theorem, 這是成立的, 但是我們來看有沒有其他的證法.

根據更加現代的理論, 一個三角形的面積是其兩邊的向量\mathbf{v}, \mathbf{w}的叉積的一半, 而叉積是這兩個向量的Gramian矩陣的行列式. 其中Gramian矩陣是:

\mathbf{G}(\mathbf{v}, \mathbf{w})= \left[ \begin{array}{cc} \mathbf{v} \cdot \mathbf{v} & \mathbf{v} \cdot \mathbf{w} \\ \mathbf{w} \cdot \mathbf{v} & \mathbf{w} \cdot \mathbf{w} \end{array} \right]

三角形0, \mathbf{v}, \mathbf{w}的三邊邊長平方分別是\mathbf{v}^2, \mathbf{w}^2以及(\mathbf{v}-\mathbf{w})^2所以這個Gramian矩陣的行列式的確對於三邊邊長是多項式的.

本文譯自Annoying Precision, 並且處於自定版\LaTeX測試中.

Categories: General Math Tags:

做数学与做学问

January 9th, 2010 No comments

看到Terence 老师在他的博客上写过一篇文章, “Does one have to be a genius to do maths”, Zhiqiang 老师评论说“他写这种文章是站着说话不腰疼.”

的确, 对于Terence老师这种12岁就获得国际数奥金牌的人来说, 天赋毫无疑问是他走向成功的一个因素. 但是, Terence老师下面这段话却发人深省:

In some cases, an abundance of raw talent may end up (somewhat perversely) to actually be harmful for one’s long-term mathematical development; if solutions to problems come too easily, for instance, one may not put as much energy into working hard, asking dumb questions, or increasing one’s range, and thus may eventually cause one’s skills to stagnate. Also, if one is accustomed to easy success, one may not develop the patience necessary to deal with truly difficult problems. Talent is important, of course; but how one develops and nurtures it is even more so.

对应的译文: (来自LiuXiaochuan老师)

有的时候,大量的灵感和才智反而对长期的数学发展有害,试想如果在早期问题解决的太容易,一个人可能就不会刻苦努力,不会问一些“傻”的问题,不会尝试去扩展自己的领域,这样迟早造成灵感的枯竭。而且,如果一个人习惯了不大费时费力的小聪明,他就不能拥有解决真正困难的大问题所需要耐心,和坚韧的性格。聪明才智自然重要,但是如何发展和培养显然更加的重要。

反过来想自己, 即使在创新能力要求极强的信息学中, 原来最重要的不是自己的那些灵光一闪的新点子, 而是严谨踏实的学术作风.

Categories: Informatics, Trivia Tags:

NOIp 2009 解题报告

November 26th, 2009 8 comments

以下是我的NOIp 2009 (提高组) 解题报告.

第一题(潜伏者, spy): 略.

第二题(Hankson 的趣味题, son):

Gcd(x,a0)=a1, Gcd(x,b0)=xb0/b1

设f(a,b) 代表b这个质因子在a中有多少个.

对于a0的任意质因子t, 若f(a0,t)=f(a1,t) 则只需保证f(x,t)≥f(a1,t), 否则f(x,t)=f(a1,t)

对于b1的任意质因子t, 若f(b1,t)=f(b0,t) 则只需保证0≤f(x,t)≤f(b1,t), 否则f(x,t)=f(b1,t)

由于x的所有因子都是b1的子集, 所以我们只需对b1的质因子按如上方法逐个检查这个质因子在x里面的取值范围(若为空则说明无解), 并按照乘法原理统计即可.

关于分解质因子: 由于b1不会超过2*10^9, 大于50000的质因子不会超过1个, 所以我们只要打出50000以内的素数表即可, 若最后除剩的b1仍未除尽, 说明此时b1一定是一个大于50000的素数.

第三题(最优贸易, trade):

做法1:

设Low[i]为从1到i当前所有路径中最便宜的价格. Profit[i]为从1到i当前所有路径中最大获利. 初始时Low[1]=P[1], Low[2..n]=infinity, Profit[1..n]=0.

那么我们可以从1开始广搜, 要注意一个点有可能多次被更新.

从i可以更新到j的条件是:

1. 存在有向/无向边(i,j)

2. Low[j]>Low[i] 或 Profit[j]<Profit[i]

做法2:

首先考虑没有环的情况, 此时1,n之间要么无法连通, 要么只存在一些单向的无环路径. 对于每一条路径, 由于不能”回头”, 走到某个点i的极优获利显然是i的费用-路径上此点之前的点的最小费用, 而此路径的最大获利便是取获利最大的点.

但是还有很多数据是有环的, 也就是对于有些点对(a,b), 在a走到b之后, b仍然可以走回到a. 在图论中, 我们把点集V, 其中任意两个点可以互达, 叫做强连通分量.

由于强连通分量中的点可以互相到达, 所以在一个强连通中的最大获利就是强连通中最贵的-最便宜的. 我们把所有强连通分量求出来缩为两个点之后. 1与n之间只存在一些无环路径, 对于这些单向的无环路径我们只需要扫描一遍便可求出最大获利.

强连通缩为两个点的具体做法: 把一个强连通缩为a,b 两个点, 连(a,b)边, a的费用为强连通中最便宜的, b的费用为强连通中最贵的. 把指向强连通中任何一个点的所有边改为指向a, 把强连通中任何一点指向强连通外部的边改为由b指出. 这样构出来的保证与原图等价.

第四题(靶形数独, sudoku): 很直白的搜索, 由于数独是NP-H问题, 所以我们肯定只能用搜索, 那么关键就在于剪枝了, 我们发现, 对于每个格子都有一个取值范围, 这个范围由其横行/纵行/小九宫格中已填的数决定, 那么无疑我们每次搜索选取值范围最小的格子搜是比较优的.

Categories: Informatics Tags: ,

Nim 取石子游戏的一些变种

November 19th, 2009 No comments

大家都知道正常的Nim游戏是取完最后一个赢. 必胜态是各堆石子异或值不为0. 现在来看看几个有意思的变种.

变种1: 取到最后一个石子的人输.
首先明确奇数个1是必败态, 偶数个1是必胜态. 这与正常的Nim不一致.
若只有一堆的个数大于1, 那么现在可以控制全场的1个数的奇偶性, 所以是必胜的. 这与正常的Nim一致.
若不止一堆的个数大于1, 由于不能转移到全是1的状态, (可能可以转移到仅有一堆大于1的状态, 但此状态与正常Nim一致), 所有当前可以转移到的状态的胜负性都是与正常的Nim一致的, 所以当前状态的胜负性与正常的Nim也是一致的.
综上, 除了全是1的状态胜负性跟正常的Nim不一致, 其余的状态胜负性与正常的Nim一致.

变种2: 只能从最左或最右的一堆中取, 取到最后一个的赢.
对于 [L,X,R] 状态, 若其是必败状态, 那么|L-R|<=1.
证明: 设[L,X,R]是必败态且R<L-1, 那么, 对于任何的1<=L’<L, [L',X,R]是必胜态. 那么对于每个L’, 都存在R’<R使得[L',X,R']是必败态, 显然不会出现[a,X,b]和[a',X,b]同为必败态的情况, 但L’有L-1个取值, R’却没有L-1个取值, 所以对于任意必败态[L,X,R], 都有|L-R|1则是必胜态, 否则, 由[X]的胜负性以及L-R的值可以推导出[L,X,R]的胜负性.

Categories: Brainstorm, Informatics Tags:

简单却难证明的数列猜想

September 11th, 2009 No comments

我们又要开始讨论有关素数的问题了. 各位大牛在考试中肯定有很多时间剩余,  在考场里闲着无聊怎么办呢? 在草稿纸上写写画画? 于是你就开始写素数数列:

2, 3, 5, 7, 11, 13, 17,19, 23, 29, 31, …

写了几项后决心利用考试剩余的时间解决几个世纪以来的各种素数生成问题. 素数数列有什么规律呢? 从等差数列开始算吧. 看一看素数数列的各项与其后一项之间的差:

1, 2, 2, 4, 2, 4, 2, 4, …

你相信素数数列不会是这么简单, 觉得它有可能是n-阶等差数列, 于是你无聊地再把差数列又减了一次:

1, 0, 2, -2, 2, 2, 2, 2, 4, …

啊? 竟然出现了最讨厌的负数?! 恼怒的你决定把所有的负数全都取绝对值, 再把数列减一次:

1, 2, 0, 0, 0, 0, 0, 2, …

就当你准备再减一次的时候, 你发现了一件怪事: 为什么每个数列的第一项都是1? 惊奇不已的你准备放弃解决几个世纪以来的素数难题, 转而研究这个问题. 在考试结束之时, 你已经列了几百个数列了, 它们都是以1打头的, 于是你猜想每一个这样的数列都是以1打头的.

Read more…

Categories: Brainstorm Tags: