Panasonic Programming Contest (AtCoder Beginner Contest 186) 题解A-F

AC代码

A - Brick

输出\(\lfloor \frac{n}{m}\rfloor\)

B - Blocks on Grid

因为只有减操作,所以一定是把所有数都减成最小值,记\(mi = \min_{1 \le i \le H, 1 \le j \le W} a_{i, j}\),则答案\(ans = \sum_{i = 1}^H \sum_{j = 1}^W a_{i, j} - mi\)

C - Unlucky 7

暴力模拟。就枚举\(i \in [1, N]\),将\(i\)拆成十进制和八进制看是否满足条件。

D - Sum of difference

可以推出排序并不会影响最后的结果

\(A\)升序排序,处理出后缀和。

现在有\(\forall j > i\)\(A_j\)的值大于\(A_i\),即\(\sum_{j = i + 1}^{N} |a_i -a_j| = \sum_{j = i + 1}^N a_j - a_i = \sum_{j = i + 1}^N a_j - \sum_{j = i + 1}^N a_i = suffix_{i + 1} - A_i \cdot (N - i)\)

然后求个和完事了。

E - Throne

记王座的位置为\(0\),那么当前的位置就是\(S\),题目转化为求使\(Ky = N - S \text{ mod N}\)成立的最小正整数\(y\)

这个其实就是个线性同余方程,等价于\(Nx + Ky = N - S \text{ mod } N\),有解的条件为\(GCD(N, K) | (N - S)\)

然后就是EXGCD板子题了。

F - Rook on Grid

这场的F感觉会比前几场难,前几场都是究极经典题。

一步可达的点就是\(x = 1\)\(y = 1\)的点。两步可达的点就是先走横轴方向再走纵轴方向或者先走纵轴方向再走横轴方向。

然后就可以推出点\((x, y)\)不可达,当且仅当存在\((X_i, Y_i)\)\((X_j, Y_j)\)\(X_i = x, Y_i < y\)\(Y_j = y, X_j < x\)

根据这个性质,就可以把所有横坐标为\(x\)都加到一个容器\(p[x]\)里,将\(p[x]\)里的点按纵坐标升序排序。

\(mx\)为纵坐标为1的点的横坐标最小值,\(my\)为横坐标为1的纵坐标的最小值。

对于所有纵坐标大于等于\(my\)的点,都无法通过先走纵轴方向再走横轴方向到达。

考虑所有横坐标为\(x\)的点,对于\(1 \le x < mx\),满足\(y\)小于\(p[x][0].y\)的点都可以通过先走横轴方向再走纵轴方向到达。剩下的点则需要通过先走纵轴方向再走横轴方向才能到达,而如果存在\(X_i \le x\)\(Y_i = y\),则无法通过这个方法到达的横坐标大于等于\(x\)且纵坐标为\(y\)的点。

对于\(x \ge mx\)的点,则只能通过先走纵轴方向再走横轴方向才能到达。

用一个数据结构标记无法通过先走纵轴方向再走横轴方向到达的纵坐标,就可以\(O(n \log n)\)解决这道题。树状数组,线段树,平衡树随便拿一个出来用就完事了。

posted @ 2020-12-19 22:33  _Backl1ght  阅读(307)  评论(0编辑  收藏  举报