CCPC 2020 威海站

gym 102798。
写了几个签到题,躺的很舒服。

A.Golden Spirit

无论怎样,一定可以先送完第一轮,即把每个人都送到对面去。

接下来只会有两种决策,一种是等到当前我所在这一侧至少有一个人休息好了开始送第二轮,另一种是先走到对岸,再等到有人休息好了开始送第二轮(因为对岸有人休息好的时间更早),取较优的解即可。

这是因为第一轮送的时候每个人开始休息的时间差了一个 \(x\) ,在第二轮中花费时间 \(x\) 送完一个人之后,对岸也一定会有一个人休息好了,于是可能出现差异的地方就只有从哪一侧开始送第二轮。

code

B.Labyrinth

如果起点终点围成的矩形里面没有障碍,答案就是曼哈顿距离。
否则如果受到障碍阻拦,那么贴着障碍走是最优的,以每个与障碍相邻的格子为起点 bfs 一下就行了。

第一次写开了 160 * 200000 的数组,把电脑卡死了。想了一下,发现先把询问离线下来就可以了。
code

C.Rencontre

如果给定树上的三个点,不难发现汇集在一点的最小距离和就是两两之间距离之和的一半。
于是根据期望的线性性统计每条边的贡献就行了。

好久没写题,第一次写的时候开边表都忘记大小要 *2 了。
code

D.ABC Conjecture

如果 \(c\) 没有平方因子,那么显然 \(rad(abc)\ge rad(c)=c\) ,无解。
否则可令 \(c=p^2d,a=pd,b=p(p-1)d\) ,则 \(rad(abc)=rad(p(p-1)d)\le p(p-1)d<c\) ,有解。

于是有解的充要条件是 \(c\) 有平方因子。枚举 \(\sqrt [3]{c}\) 以内的数尝试对 \(c\) 分解,如果剩下的数 \(>1\) ,则它只可能是素数或者两个素数之积,再判断一下它是否为完全平方数即可。也可以直接用 Pollard-Rho 解决。

code

G.Caesar Cipher

考虑用线段树维护字符串的哈希值,由于每次只 \(+1\) ,所以所有位置取模的次数之和是 \(O(\frac {nq} P)\) 的。

线段树的每个节点记录一下区间哈希值以及区间内 \(a_i\) 的最大值,修改时如果遇到 \(\max a_i=P-1\) 的节点,就递归下去暴力处理,否则整体修改哈希值即可。

自然溢出会被卡,用双哈希比较稳健。

code

H.Message Bomb

给每个集合记录一下总信息条数,一个人加入某个集合时,将他的答案减去这个集合当前已有的信息数目,一个人离开某个集合时,将他的答案加上这个集合当前已有的信息数目。
最后把每个人还没离开的集合的贡献加上去就行了。
code

J.Steins Game

黑白石子之间互不影响,所有黑色石子是一个游戏,其 SG 值与每堆白色棋子的 SG 值的异或就是全局的 SG 值。

打了个表观察黑色石子的 SG 值,和源哥,ldx 讨论后发现这个 SG 值就是 最少的那一堆的数目 - (有几堆是最少的 + [每堆都是最少的]) % 2 。

于是把所有石子堆排序,从大到小枚举黑色石子中最少的那一堆的数目以及有几堆是最少的,对当前可能成为白色的石子堆维护一个线性基就行了。
code

L.Clock Master

这个答案就是拆出来的所有数的 LCM ,于是只会用到质数的幂,多余的可以用 1 凑上,做一个背包就行了。
code

posted @ 2021-06-11 23:10  jklover  阅读(194)  评论(0编辑  收藏  举报