gym 102798。
写了几个签到题,躺的很舒服。
A.Golden Spirit
无论怎样,一定可以先送完第一轮,即把每个人都送到对面去。
接下来只会有两种决策,一种是等到当前我所在这一侧至少有一个人休息好了开始送第二轮,另一种是先走到对岸,再等到有人休息好了开始送第二轮(因为对岸有人休息好的时间更早),取较优的解即可。
这是因为第一轮送的时候每个人开始休息的时间差了一个 (x) ,在第二轮中花费时间 (x) 送完一个人之后,对岸也一定会有一个人休息好了,于是可能出现差异的地方就只有从哪一侧开始送第二轮。
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 解决。
G.Caesar Cipher
考虑用线段树维护字符串的哈希值,由于每次只 (+1) ,所以所有位置取模的次数之和是 (O(frac {nq} P)) 的。
线段树的每个节点记录一下区间哈希值以及区间内 (a_i) 的最大值,修改时如果遇到 (max a_i=P-1) 的节点,就递归下去暴力处理,否则整体修改哈希值即可。
自然溢出会被卡,用双哈希比较稳健。
H.Message Bomb
给每个集合记录一下总信息条数,一个人加入某个集合时,将他的答案减去这个集合当前已有的信息数目,一个人离开某个集合时,将他的答案加上这个集合当前已有的信息数目。
最后把每个人还没离开的集合的贡献加上去就行了。
code
J.Steins Game
黑白石子之间互不影响,所有黑色石子是一个游戏,其 SG 值与每堆白色棋子的 SG 值的异或就是全局的 SG 值。
打了个表观察黑色石子的 SG 值,和源哥,ldx 讨论后发现这个 SG 值就是 最少的那一堆的数目 - (有几堆是最少的 + [每堆都是最少的]) % 2 。
于是把所有石子堆排序,从大到小枚举黑色石子中最少的那一堆的数目以及有几堆是最少的,对当前可能成为白色的石子堆维护一个线性基就行了。
code
L.Clock Master
这个答案就是拆出来的所有数的 LCM ,于是只会用到质数的幂,多余的可以用 1 凑上,做一个背包就行了。
code