2016-E07-team2
从 Trac 迁移的文章
这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。
原文章内容如下:
||User||Problem||Result||Memory||Time||Language||Length||Submit Time||
||TaZoF||F||TLE|| || ||G++||1027||2016-09-22 16:52:12||
||TaZoF||I||AC||15896||1185||G++||1503||2016-09-22 15:26:22||
||TaZoF||B||AC||2612||702||G++||1471||2016-09-22 14:48:02||
||TaZoF||M||AC||75080||4149||G++||2162||2016-09-22 14:32:10||
||TaZoF||B||TLE|| || ||G++||2209||2016-09-22 13:37:55||
||TaZoF||B||TLE|| || ||G++||2195||2016-09-22 13:23:50||
||TaZoF||D||AC||1412 KB||15 ms||GCC||408||2016-09-22 12:44:39||
比赛链接: http://bak.vjudge.net/contest/133358
== 流水账 ==
=== TsReaper ===
开场后很快发现了简单题D,'''D1y14'''。之后我们决定尝试通过数量较多的B,学长们想了一个AC自动机的做法,但是没有仔细运算复杂度,T了两次。starve学长写B期间hzf学长想到了M的做法,我也想到了B更科学的做法。starve学长下机后我写M,'''M1y122''',之后starve学长'''B3y138'''。
之后我和hzf学长想F,starve学长发现I似乎是比较明显的三维偏序问题,而且数据范围也很好。虽然觉得I题还没什么队过真的科学吗,不过暂时没什么题可以写了,而且学长做法也比较科学,学长就写了,'''I1y176'''。F题我们想了一些办法,但是复杂度都太高了。
== 总结 ==
=== TsReaper ===
* 做得好的地方
* I题虽然没什么人过,但是对解法比较有自信,是正确的决策。
* 做得不好的地方
* B题AC自动机写之前没有仔细分析复杂度,一段时间思路都被AC自动机限制。
* 10^9^以内因数最多的数只有1344个因数。这个数据不知道,使得复杂度分析不正确,很多简单的做法都没有考虑。
== 题解 ==
=== B - Bazinga ===
如果用AC自动机,复杂度是O(TN*2000*26),时限只有1s太紧了。
可以这样想:如果最后一个字符串不能满足条件,那么之前所有的串都是最后一个串的子串。这样,我们可以预处理最后一个串里,哪些子串是之前的串。然后我们枚举之前所有串,看看它在最后一个串里的区间是否包含了它前面的串。这样,复杂度就是O(T(N*2000+N^2^))。
=== D - Pagodas ===
显然,所有能建成的塔的编号都能写成ax+by的形式。也就是说,这些编号都是gcd(a,b)的倍数。显然一共还能建成n/gcd(a,b)-2座塔,判断一下奇偶性即可。
=== F - Frogs ===
如果知道了10^9^以内因数最多的数只有1344个因数,很多方法就能使用了。
如果一只青蛙的步长为x,那么它能占领的石头编号就是gcd(x,m)的倍数。设f(i)表示所有满足“x能被m的因数i整除,而不能被m大于i的因数整除”的x值之和,显然有f(i) = (m-i)*(m/i)/2 - sum(f(j)),j是m的因数且是i的倍数。接下来我们枚举所有m的因数i,如果存在一只青蛙的步长可以整除i,说明f(i)所代表的石头编号都能被青蛙占领,那么答案加上f(i)。这样做的复杂度是因数的平方级。
=== I - Triple ===
很容易对于每对(c,d),求出c和d已知时,最大的a是多少。然后就是对10^6^个点做三位偏序问题即可。
=== M - Meeting ===
像做dijstra一样,记一个当前已求出最短路的点集合S,和一个待考虑的优先队列Q。每次从Q里取出离起点最近的set,把set里所有的点都放进S里,再把这些点属于的其它set算好距离后放进Q中即可。
== 补题 ==
=== TsReaper ===
~~F~~, G
| User | Problem | Result | Memory | Time | Language | Length | Submit Time |
| TaZoF | F | TLE | G++ | 1027 | 2016-09-22 16:52:12 | ||
| TaZoF | I | AC | 15896 | 1185 | G++ | 1503 | 2016-09-22 15:26:22 |
| TaZoF | B | AC | 2612 | 702 | G++ | 1471 | 2016-09-22 14:48:02 |
| TaZoF | M | AC | 75080 | 4149 | G++ | 2162 | 2016-09-22 14:32:10 |
| TaZoF | B | TLE | G++ | 2209 | 2016-09-22 13:37:55 | ||
| TaZoF | B | TLE | G++ | 2195 | 2016-09-22 13:23:50 | ||
| TaZoF | D | AC | 1412 KB | 15 ms | GCC | 408 | 2016-09-22 12:44:39 |
比赛链接: http://bak.vjudge.net/contest/133358
流水账
TsReaper
开场后很快发现了简单题D,D1y14。之后我们决定尝试通过数量较多的B,学长们想了一个AC自动机的做法,但是没有仔细运算复杂度,T了两次。starve学长写B期间hzf学长想到了M的做法,我也想到了B更科学的做法。starve学长下机后我写M,M1y122,之后starve学长B3y138。
之后我和hzf学长想F,starve学长发现I似乎是比较明显的三维偏序问题,而且数据范围也很好。虽然觉得I题还没什么队过真的科学吗,不过暂时没什么题可以写了,而且学长做法也比较科学,学长就写了,I1y176。F题我们想了一些办法,但是复杂度都太高了。
总结
TsReaper
- 做得好的地方
- I题虽然没什么人过,但是对解法比较有自信,是正确的决策。
- 做得不好的地方
- B题AC自动机写之前没有仔细分析复杂度,一段时间思路都被AC自动机限制。
- 109以内因数最多的数只有1344个因数。这个数据不知道,使得复杂度分析不正确,很多简单的做法都没有考虑。
题解
B - Bazinga
如果用AC自动机,复杂度是O(TN*2000*26),时限只有1s太紧了。
可以这样想:如果最后一个字符串不能满足条件,那么之前所有的串都是最后一个串的子串。这样,我们可以预处理最后一个串里,哪些子串是之前的串。然后我们枚举之前所有串,看看它在最后一个串里的区间是否包含了它前面的串。这样,复杂度就是O(T(N*2000+N2))。
D - Pagodas
显然,所有能建成的塔的编号都能写成ax+by的形式。也就是说,这些编号都是gcd(a,b)的倍数。显然一共还能建成n/gcd(a,b)-2座塔,判断一下奇偶性即可。
F - Frogs
如果知道了109以内因数最多的数只有1344个因数,很多方法就能使用了。
如果一只青蛙的步长为x,那么它能占领的石头编号就是gcd(x,m)的倍数。设f(i)表示所有满足“x能被m的因数i整除,而不能被m大于i的因数整除”的x值之和,显然有f(i) = (m-i)*(m/i)/2 - sum(f(j)),j是m的因数且是i的倍数。接下来我们枚举所有m的因数i,如果存在一只青蛙的步长可以整除i,说明f(i)所代表的石头编号都能被青蛙占领,那么答案加上f(i)。这样做的复杂度是因数的平方级。
I - Triple
很容易对于每对(c,d),求出c和d已知时,最大的a是多少。然后就是对106个点做三位偏序问题即可。
M - Meeting
像做dijstra一样,记一个当前已求出最短路的点集合S,和一个待考虑的优先队列Q。每次从Q里取出离起点最近的set,把set里所有的点都放进S里,再把这些点属于的其它set算好距离后放进Q中即可。
补题
TsReaper
F, G
附加文件
- 2016-E07-team2.zip by TsReaper
- 2016-E07-team2.2.zip by TsReaper
- F.cpp by TsReaper
- e.cpp by 3ZStarve