AFAIK

Valar Morghulis

GCJ 应该是可以骗到一件衣服的 - -

POJ 的奖品居然没骗到 >__< 做到一半机房断网了于是 #11 真是不能更爽

Google Codejam Round 2

A

一开始看错题了……

显然最后每个人的路线是不相交的,允许包含。于是上车点与下车点构成了括号序列。

然后用栈处理一下就好。

B

假设第一步是二分吧(感觉有不用二分的方法),那么我们的问题就是判定一个人最好/最坏排名是多少。

共有 \(T\) 个人,令 \(f(x, T)\) 表示能力排名为 \(0 \leq x < T\) 的人最差排名是多少。考虑 \(x = 0\) 的情况,易得 \(f(x, T) = T - 1\) 。否则,最差情况下, \(x\) 会被打败,而且下一轮中 \(x\) 的能力值排名是所有可能的值中最大的。 \(x\) 之前有 \(x\) 个人比他强,进入败者组的人至多有 \(\lfloor\frac{x - 1}{2}\rfloor\) 个人,所以有 \(f(x, T) = \frac{T}{2} + f(\lfloor\frac{x - 1}{2}\rfloor, \frac{T}{2})\)

最好情况类似,令 \(g(x, T)\) 表示 \(x\) 最好可以打败多少人,可以得到当 \(x = T - 1\) 时有 \(g(x, T) = 0\) ,否则有 \(g(x, T) = \frac{T}{2} + g(\lfloor\frac{x + 1}{2}\rfloor, \frac{T}{2})\)

python 真是极好的。

C

根据 LIS 和 LDS 序列可以构出一个拓扑图,一条有向边 \(s \to t\) 表示 \(x_s < x_t\) 。我们要求这个拓扑图的一个拓扑序列,满足 1 出现的位置尽量靠前,在此基础上, 2 出现的位置尽量靠前 etc 。

直接上伪代码吧 = =||

def dfs(x) : # 要使得 x 尽量先出来
    if x 已经在拓扑序中 :
        return
    ys <- 所有要使得 x 出来必须出来但是还未出来的点
    sort ys increasingly
    for y in ys :
        dfs(y)
    Q += [x]

Q = []
for i from 1 to n :
    dfs(i)
# 然后 Q 就是要求的拓扑序

这样做显然是 \(O(n^2)\) 的。

其实有个更好写的 \(O(n \log n)\) 的方法。反向建图,每次选择标号最大的点出来,相当于求出逆拓扑序。

D

计算几何,哈哈哈哈。

POJ Challenge Beta 1

有中文题面,这真是极好的。

A

\(a(a + b) = c^2\) 可得 \(a = \frac{\sqrt{b^2 + 4c^2} - b}{2}\) ,可以发现只要 \(\sqrt{b^2 + 4c^2}\) 为整数即可,奇偶性可以保证。

\(b^2 + 4c^2 = d^2\)\(b^2 = (d - 2c)(d + 2c)\) 。易知 \(d - 2c \leq 4\) ,所以枚举 \(d - 2c\) ,看看是否存在整数 \(c\) ,如果存在 \(c\) 就可以直接求 \(d\) 然后求 \(a\) 了。

为啥 \(d - 2c \leq 4\) ?当 \(b\) 为奇数时显然 \(d - 2c = 1\) ,当 \(b\) 为偶数时 \(d - 2c = 2, d + 2c = \frac{b^2}{2}\)\(d - 2c = 4, d + 2c = \frac{b^2}{4}\) 中至少有一组可行解。(其实继续分析下去可以直接找到规律,只不过这样已经很好写了于是就直接写了。)

B

一个 \(O(n^3)\) 的 dp 是显然的, \(f_{i, j}\) 表示区间 \([i, j]\) 的最优解,枚举根进行转移。

然后我就不会了 = =

不过我是怎么在 20min 过的呢……因为我看到有人(wkn ?)在 15min 过了,于是觉得这个题应该是可做的,于是猜了个结论: \(f_{i, j}\) 的根只可能是 \(i\)\(j\) 。随机生成了几组极限数据试试发现是对的……然后就没有然后了……

感觉如果按照 dp 的一般优化思路去想的话应该也是可做的。

C

如果一个数同时出现在两组限制中,那么这两组限制必定是连续的,也就是最后的限制就是若干条链,每条链分别搞搞就好了。

感觉好多细节啊不想写啊。你要牛逼就写 PQ 树去吧哈哈哈哈。

D

std 的想法大概是 dp 吧, \(f_{i, j}\) 表示最后一条线段是 \(i \to j\) ,转移的话利用极角序优化一下就好了。

我写的另外一种方法,但是 WA 了。

考虑枚举最低点。两边点到这个点的斜率递增,求出斜率后直接 LIS 。为啥我会错……难道老了连 LIS 都不会了么 T_T

E

果的数据结构题。

依次 dfs 每个点。对于 \((a, b)\) ,我们要求所有的 \((c, d)\) 数目使得 \((c, d)\) 能够覆盖 \((a, b)\) ,我们在 dfs c 的时候在 d 点放个标记,那么在 dfs a 的时候就相当于查询 b 到根的路径上有多少个标记。显然 dfs 序 + 树状数组。

F

显然是原题。

半平面交是 \(O(n^2 \log n)\) 的吧。似乎我估错复杂度以为是 \(O(n^3 \log n)\) 的就没写了 →_→

模拟退火 balabala 不知道怎么样。你要牛逼就写 Voronoi 图去吧哈哈哈哈。

似乎这几天刷水刷的比较多 >_<

似乎最近卖萌比较多 >__<

Problem

在一个单位圆上随机取点,期望要取几个点,才能使这若干个点的凸包包含圆心?

Read more »

一来就发现 roosaphu #1 。

然后 cp12321 #2 。

然后 kAc #5 。

其中必有引擎。我就呵呵不说话。

(这场 CF 真心是给国人做的)

(我不知道我对 unrated 是该高兴还是该悲伤)

Solution

B

原题可以抽象出这么个模型:给定 \(m\) 个数,要求分成 \(p\) 组,最后每个元素对答案的贡献为它所在组的最大值,求答案的最小值。

排序是显然的。然后序列上 dp : \(f_{i, j}\) 表示前 \(i\) 个数分成 \(j\) 组,最小的总贡献是多少。转移考虑转入,枚举第 \(j\) 组的元素个数。

\[f_{i, j} = \min_{k < i} (f_{k, j - 1} + (i - k) x_i) = i x_i + \min_{k < i} (f_{k, j - 1} - k x_i)\]

然后就可以斜率优化了。考虑两个决策 \(p < q < i\)\(q\)\(p\) 优的充要条件是 \(f_{p, j - 1} - p x_i > f_{q, j - 1} - q x_i\) 也就是 \[x_i > \frac{f_{q, j - 1} - f_{p, j - 1}}{q - p}\]

我相信只要你看了 杨哲 《凸完全单调性的一个加强与应用》,你就一定会做这个题。

C

我相信只要你看了 周奕超 《墨墨的等式》 出题报告,你就一定会做这个题。

一眼题不多说。

D

问题主要就出在那个啥三次方上吧。

你有没有感到很奇怪,为啥会给一个奇怪的数 95542721,还特意说明这是个素数?

其中必有隐情。

疑心重重, \(\phi(95542721) = 95542720\) ,这个数与 3 是互质的。

于是我们试着在 \(\mod{95542720}\) 的意义下求 3 的幂。

于是乎,你会发现 \(3^{48} \equiv 1 \mod{95542720}\)

剩下的就不用我多说了。用线段树维护 0 到 47 次立方后的结果。

E

我相信只要你做了 Topcoder SRM 558 Div1 1000pts SurroudingBoard ,或者听懂了 曹钦翔 《线性规划与网络流》 ,你就一定会做这个题。

首先那个啥 friend 是用来搞笑的。

每个变量可以取 0 或 1 ,有些取 0 需要代价,有些取 1 需要代价。有种网络流的既视感……

剩下的就是那个特殊的获利的方法:当若干个变量全 0 或全 1 的时候,可以获得一定利润。

如果你突然有了 IDEA ,可以直接构出图:先把利润全部加入答案,然后对于每种获利方式建立一个节点。考虑啥时候需要这利润从答案里扣除。不妨设此时的限制为某些变量全 1 就得到利润吧,那么必定是这些变量中的一些为 0 那么就得扣除利润。某些变量为 0 的话,网络流中的表示为与 T 连通,我们直接把 S 连向利润这个点,容量为利润,再把利润这个点连向与其相关的那些变量,容量无穷大。这样的话一旦有个变量为 0 (图上对应的就是与 T 连通),那么利润这个点必定与 T 连通(无穷大的边你割不去),所以必定要割掉 S 与利润这个点的连边,相当于减去了利润。这就是个最小割模型。

当然你要是牛逼,直接上 cqx 的线性规划也是可以的。我试了一下,发现 SurroudingGame 和这个题都可以用线性规划建模的方法通杀,无比炫酷。

nonsense

节操掉尽,请勿再念。

@xiaodao 关于 #183 D 的 solution …… 我只能说 what the heck 当初觉得很明显的一步我居然不会证 →_→ 于是剩下的就坑了。

首先要证明数的大小一定是 \(\frac{1}{n+1}\) ,然后就好证明了。(这一步怎么证明……我只能说 wiki 上有一句原话)

对于 \(kx = \frac{k}{n+1} = b^p x - q\) ,我们有 \(k = b^p - q(n+1)\) ,在 \(\mod{n+1}\) 意义下有 \(k=b^p \mod{n+1}\) 。由于对于每个 \(k\) 都存在这么一个 \(p\) ,所以容易知道 \(n+1\) 一定为质数,且 \(b\)\(n+1\) 的一个原根。

这次 CF 被拉过去当 Tester ,就写了 BCDE 的没写 A ,结果 A 的 checker 就挂了,真是不能更逗。不得不说他们几个(@lyd, @wqs, @zgx)还是很认真的

近期做的两道题。

Problem

ProjetEuler-429

定义 \(d\)\(n\) 的单位因子,当且仅当 \(gcd(d, \frac{n}{d}) = 1\)

\(f(n)\) 表示 \(n\) 的所有单位因子的平方和。例如 \(f(24) = 1^2 + 3^2 + 8^2 + 24^2 = 650\)

\(f(10^8 !)\)

湖大 ACM 区域赛 A

\(\lceil (a + \sqrt{b})^n \rceil \mod{m}\)

\(b, n \leq 2^{30}, a, m \leq 2^{15}\)

保证 \((a - 1)^2 < b < a^2\)

Read more »

Problem

有一个 \(n \times n\) 的矩阵,你可以任选 \(k < n\) 个格子并控制它们。任意时刻对于任意一个格子,如果它周围有不小于两个格子被控制,那么这个格子也会被控制。问是否存在一种初始选择 \(k\) 个格子的方案使得最后 \(n \times n\) 个格子都被控制?

Read more »

心情随笔,不喜勿看,自行 Ctrl-W。


最近一段时间重新翻开了高一时“某人”写的一篇文章,《无尽的远方,无数的人》。这句话出自鲁迅的《这也是生活》,原文是:“无尽的远方,无数的人,都与我有关。”。最近由于某些原因(情感问题?不要在意这些细节)突然之间想起了这篇文章。当初这篇文章是 2011 北约作文题,老李于是要我们写这篇作文。“某人”的这篇文章,看了后真的难以忘记。

一群人、几个人、两个人、一个人,生命的历程就是这样。

一群人只是生命中的过客。你与他擦肩而过,不留下一点痕迹。最后的回忆也只剩一句:哦,我似乎听过这个人。但是周围的那些人终究散去,只留下几个人愿意等你。

于是这几个在你的回忆中留下了一丝痕迹。他们或多或少会给你一些关心与帮助。但是几个人也终将离去,只剩下两个人的世界。

于是你愿意将兴趣爱好分享给他,你愿意将喜怒哀乐告诉他,你也愿意和他一起欢乐,一起悲伤。两个人的世界总是美好的。

所以有这句话:生命纯属偶然,所以每一个生命都要依恋另一个生命,相依为命,结伴而行。我更愿意把这句话理解为朋友之间的友谊。有人结伴而行,生活不会孤单。

可是……一切构建在时间之外的友情都是破碎的?

可是……一切构建在共同点之外的友情都是破碎的?

不管是谁,总有分开的一天。所以最后,我们还是孤独的一个人。

人生注定是场孤独的旅程。

所以老李在高一第一节课中说道:要做一个耐得住寂寞的人——或者说,要做一个内心强大的人。

一直自认为内心强大,却也耐不住寂寞。享受孤独?我没能这么强大。所以说我渴望友情,倒不如说是害怕孤独。

孤独是“灵魂渴望被理解的持久的诉求”,所以我才觉得孤独吧。

所以也有这句话:生命纯属偶然,所以每一个生命都不属于另一个生命,像一阵风,无牵无挂。

“那就去爱人吧。”

第一次读完这篇文章后,最引起我注意的就是这句话。爱人,是面对孤独的最终解决方案。与生俱来的孤独不能驱散,悲悯之心却会给你力量。


不管怎样,我都渴望一个人,一个能真心交往的朋友。

不得不想起 lyd 和 shy 。我更愿意把他们看成是一对知心朋友而不是一对情侣。

自然有些人是生命中的过客。

自然有些人看起来关系很铁但只是一层纸。

自然有些人是可望而不可即的。如 fanhq 。

自然有些人是你想却总也交不上的。如 XLk 。

本性自然是极好的,但是本性只能高考。梦想着贵系的男人啊,加油吧。

“某人”?你会只是我生命中的一个普通过客吗?

“某某人”?好久不见不知道还记不记得我呢。

某盾能容忍我的小把戏——却是早已上大学。

谢总向总?鸟总要飞走,人总要离去。

我很感激那些给过我关心与帮助的人。只是——

我还是孑然一人,一个被孤独困住的人。

天之涯,地之角,知交半零落。

Problem

Alan 和 Danny 在一座山的两边。初始时两人均在海平面上。他们想在山上的某个位置碰面,并且任意时刻两人所在地的海拔高度都相同。这是否总是可行的?

山就是一条折线段,保证一个 \(x\) 只对应一个 \(y\) ,山上每个点均在海平面上,且山两段海拔为 0 。

Read more »

似乎我 YY 出一个不同的方法?

Problem

无穷平面上有两个点 \(A, B\) ,两点距离为 \(D\)\(A\) 一步可以移动到距离不超过 1 的地方。而且 \(A\) 移动后可以知道距离 \(B\) 是远了还是近了。求一种方法使得 \(A\) 移动 \(D + o(D)\) 步后两点距离不超过 1 。\(f(x) = o(g(x))\) 表示 \[\lim_{x \to \infty} \frac{f(x)}{g(x)} = 0\]

Read more »

没想到坑的居然是 C 题 →_→

已填坑。

鼓起勇气用一次大号,结果……结果 unrated 真是喜闻乐见(不然我要跌回黄了)。

Solution

A

这题特别坑。我就不说我 -6 了。

首先注意到,我们可以把任意两个元素一起取反,所以最后至多剩下一个负数。

\(n\) 是奇数的时候,如果还剩下一个负数,我们选择这个负数以及 \(n - 1\) 个正数,可以把负数的个数变为偶数,所以最后必定是每个元素都是正数,直接求绝对值的和就好了。

\(n\) 是偶数的时候,最后剩下的负数的绝对值是绝对值最小的数的绝对值,判掉就好。

B

由于 \(d\) 特别大,所以可以认为重复经过一个点是不可能的,直接跑最短路就好了。

明明 floyed 好写多了为啥还有人写 SPFA/dijkstra 呢。(模板党请自行无视这句话)

C

好牛叉的构造。

我们完成两个任务: 1. 在字符串末尾放上两个 ? 2. 利用这两个 ? 进行加法

第一个的构造:在最后放上一个命令 >>? 凭空在字符串开始出产生一个 ? 。然后在之前放入若干个 ?x>>x? x 从 0 枚举到 9,把这个 ? 不停从字符串开始传到字符串结束,最后再在一个合适的地方构造 ?>>?? 即可。

第二个的构造:我们以 ?? 为分界线,?? 前的部分表示未处理的, ?? 后的部分表示已处理的。构造若干个 x??<>y 其中 y = x + 1 ,表示一旦最后一个未处理的数不是 9 ,我们把这个数加上 1 后终止算法。接着特判 9 , 9??>>??0 9 + 1 = 10 进位需要继续处理。最后还需要一个特判:如果初始时的串全部都是 9 ,那么我们需要在前面补个 1 ,??<>1

D

想了好久的这个题,最后的结果是看错题了。

注意到 \(p\) 是一个排列,而满足 \(a \| b\)\((a, b)\) 的个数是 \(O(n \log n)\) 的,因此可以考虑对于询问统计有多少 \((a, b)\) 在这个询问里面。

\((a, b)\) 抽象成平面上的一点,则每个询问就是查询某个矩形内点的个数。很水了吧,离线乱搞就好。

E

很显然是 dp 。

首先我们要解决一个子问题: \(1, 2, \dots, n\) 内每个数的出现次数依次为 \(a_1,a_2,\dots,a_n\) ,求这些数构成的不同的 good sequence 的数目。由于前不久的中南校赛中出现过一道类似的题,我直接说结论了(我觉得解释起来很绕 →_→)

\[\prod_{i = 2}^{n} {a_i - 1 \choose \sum_{j=1}^i (-1)^{i - j} a_j}\]

于是 dp 中需要记录当前的最大值(强制令最小值为 1)、当前的总个数、当前的方案数、 \(\sum_{j = 1}^i (-1)^{i - j} a_j\) ,转移就是枚举当前这个数出现次数,复杂度算起来是 \(O(n^5)\) 的,但是由于常数特别小,递归式的 dp 可以过 →_→

一开始组合数的上界设小了囧了好久。

situation

CF 真心太脆弱了。

看了 A 觉得不是一眼题就有点虚。YY 了个结论发现是错的,继续 YY 发现还是错的,接着 YY 仍然还是错的我快受不了。最后 -6 强过 pretest 。

收到了 unrated 的信息就不想做了 →_→

others

目测一堆人和我一样看到 unrated 就不做了 →_→

Problem

有两个多重集 \(A, B\) ,每个多重集内有 \(n\) 个元素,所有元素都是 1 到 \(n\) 之间的整数。

求证:一定存在两个多重集 \(a \subseteq A, b \subseteq B\) ,使得 \(\sum_{x \in a} x = \sum_{y \in b} y\)

Read more »
0%