Wizmann / ACM-ICPC

感觉自己做了假题。
http://wizmann.tk
Other
63 stars 29 forks source link

Round 2 2018 #29

Open Wizmann opened 4 years ago

Wizmann commented 4 years ago

Code Contest

先快速写一个版本,后面再补齐吧

A. Falling Balls

我们把初始状态(n个1)和最终状态写在两行。然后画箭头将球进行转移。 如果所有的箭头不相交(可以有相同的目标点),那么一定有解。 可以很容易的观察得出,我们可以从左边开始,向右画依次箭头。最后把这种策略转化成题目要求的图即可。

B. Graceful Chainsaw Jugglers

DP可做。

又通过暴力枚举,我们可以观察到R和B的基本是连续的,也就意味着最大值不会超过sqrt(n)。所以在O(n n n)的复杂度下可做。

我觉得一般情况下就不要乱猜结论了。。。浪费时间还做不对。。。

C. Costume Change

二分图裸题。

为啥我就看不出来呢?。。。

D. Gridception

先写我自己的做法,标程比我的优一个数量级。后面补。 这题是不难的,只要不写挫了就行。

观察得出,最终结果一定是原图2x2的格子经过放大之后形成的pattern。每一个原图的格子放大到n * n个格子即可。(假设n > m,这样可以足够包裹之前的小矩形了)

因为2x2的格子最多有2^4=16种可能。我们在原矩阵中枚举这些可能性,然后对其进行放大。然后把原矩阵放到放大后的矩阵进行匹配,然后在其中找到最大的联通图形。

最大的时间复杂度是(假设 n > m):

  1. 16种可能
  2. 每个大矩阵的size是 (2 n)^2,所以在大矩阵中进行匹配一共有(2 n)^2个起始位置
  3. 每次匹配的时间复杂度是n n,找联通图形的复杂度是n n

所以总的复杂度是O(n^4),常数是64。加点优化,勉强能用Pypy卡过去,对C++来说应该不是问题。

原题的解法也是枚举16种格子,然后在原矩阵上划十字线(四个象限)。在每个象限上找相对应的颜色,然后找联通块。这样的常数是16,复杂度是O(n^4)。