某岛

… : "…アッカリ~ン . .. . " .. .
May 27, 2014

2014 ACM/ICPC 北京邀请赛

http://acmicpc.info/archives/1703
http://www.cnblogs.com/kuangbin/p/3744817.html

Problem A. Matrix

Analysis:

【贪心】【递归】【生成链】
比较容易写错。
。。。不难归纳生成矩阵的性质。
1. 每行的数单调递增。(。。。因为每个格子的数只有可能减小,且最大的数一定出现在行末尾)
2. 每行的 size 单调递减。。。(因为下方的数,总是被后出现的较小的数顶下去的。。)

观察一些数据。。。

4 3
2 1 3
1 2
1 4 

。。这个显然是 4 2 1 3 。。。。

。。。考虑定位当前最大的数在 输入序列 中的位置。。
。。为了得到逆序字典序最大。。我们希望它可以尽可能的往后。。
。。。我们从 4 开始。。向上剥开生成 4 的链 1-2-4 。。。但是发现此时 1 并不是其所在行的最末尾数。。。
。。因此 3 必须在这条链之后插入。。。。于是我们优先递归 3 。。。

于是就是两个函数。。。
bool gao(); 从大到小枚举没有定位的数,将它们一次 bao() 开。。。
bool bao(int ii); 递归尝试剥开 ii 。。C[ii] 表示 ii 所在的行号,-1 表示已经定位。。。
这样不需要二分。。。总的复杂度是 O(n) 、。。。

Problem B. Beautiful Garden

Brief description:

。。。给定一组序列,修改最少的元素,使得该序列排序后是一个等差序列。

Analysis:

观察一些数据。。
1 4 6 100 1000 10000
结果是。。
1 *2 *3 4 *5 6

。。。最终序列的首位置一定可以是原序列中的某个数(因为修改的任意性,你可以尽可能的放到后面。)
。。除此之外,还可以至少有一个数不修改。。。枚举这两个数。。。
。。。再枚举公差 dd。。

(。。。注意这一步不需要枚举所有可能的公差。。
。我们只需要枚举这两个数之间包含的数的个数。。
..。而这个值不会超过 n-2 。。)

注意:
。。long long ?(这种题目数据是 int 但是运算过程中有可能是 long long 的要尤为小心。。
dd = 0
n <= 2

Problem C. Champions League

Brief description:

。。。。这个题真是相当之赞。。。
。。不妨先来看一种 naive 的做法。。。。

。。。对每一个 group。。。枚举 2^3 种情况。(考虑 0-1, 0-2, 0-3 、、。。)。。。
。。每次,得到 6 对数,对每对数取 max 得到这一天的最大得分。。。
。。排序后取前缀和。。就可以得到容量 1~66 个 物品。。。然后外围 0/1 背包。。。

。。不幸的是。。这个做法是只能保证 group 内没有冲突的。。。

1

。。。。这样一来我们似乎需要加维来描述这种结对信息。。。。。但是稍作尝试后我们发现这样处理讨论起来会过于复杂。。。
。。不如直接暴力 1<<6 状态压缩 DP 来的有效。。。。

。。。但是这样会 TLE。。我们发现其实只需要保留最大的 6 个小组即可。
。。 (把多有 a[][] 塞到一个 vector 里从大到小排序比较。。)。。。
。。(因为我们只会取 6 天。。最差情况。如果每个 group 只转播一场。。也只需要用到前 6 个小组。。)
。。。。

External link:

https://gist.github.com/lychees/e6ea2af33bac01288cc8