T1 codeJan与恐怖分子
可以根据 codeJan 的位置,将方格矩阵分成四个子矩阵分别考虑。对于每个子矩阵如果存在边长为 0 的话,就不用考虑。如果存在边长小于 K 那一定不能完成任务,否则依次按照行列炸毁。因为要炸毁所有区域且允许重复炸一个区域,所以对于 a∗b 的子矩阵行上需要 [Ka⌉ 排炸弹,列上需要 ⌈Kb⌉ 排炸弹。注意结果会爆 int。时间复杂度:O(1)。
T2 codeJan与旅行
可以想象的是如果 m 足够大,codeJan 最后肯定会选择在相邻的两个城市来回走。所以可以枚举两个相邻的城市 (实际上应该是距离最小的两个城市)。并且直接” 奔向” 这两个城市的应该是最吼的!但是还要考虑,可能先往后退到 一个城市,再” 奔向” 枚举的城市。
举个例子就明白了:n=3,m=10,p=2,三个城市的位置是 1 10 14。那么应该 先退回到 1,然后再在 10 和 14 之间来回走。时间复杂度:O(n)。
T3 小Q与氪金游戏
如果 x>=y,直接枚举氪金单数进行计算,否则不同的抽卡次数会对应不同的氪金单数,可以直接枚举抽卡次数进行计算,只需要枚举足够多项即可达到要求的精度,标程枚举了 106 项。
T4 codeJan与青蛙
先把所有的青蛙按照位置从小到大排序。下面用“代价”代称听到的 WA 次数。dp[i][j] 表示用 j 个黑洞收集前 i 个位 置青蛙的最小代价。枚举第 j 个黑洞的放置位置 k,可以得到状态转移方程:
dp[i][j]=min(dp[k−1][j−1]+cost[k][i])
其中 cost[k][i] 表示第 k 到 i 位置的青蛙全部被放在 k 位置上的黑洞收集的代价。 如果我们定义:
sum[p]=∑i=1pb[i],fsum[p]=∑i=1pa[i]∗b[i]
因此可以通过O( nm2)的复杂度得到 dp[n][m]。 可以在 dp 过程中顺便记录第 j 个黑洞的收集数量和前一个状态的最少容量,进行比较更新即可。
T5 珂朵莉与GCD
从一个点 r 开始往左端的 gcd 最多只会变化 logv 段先预处理出每个点到一端的 所有 gcd 变化的位置然后把询问离线扫描线右端点,维护所有左端点的答案即可总复杂度 O(mlognlogv+nlogv)。