Timeline
08:00-08:10
通看一遍题目,A 像性质题,B 6,7 点感觉可以贪(?,剩下的感觉???,C 感觉暴力写起来很麻烦,D 无头绪只会暴力,先把 A 暴力写了
08:10-08:40
A 性质没想出来,B 贪想到了一个细节导致代码好难写(也许根本就没法贪)
08:40-09:00
把 C 的部分分和 D 的暴力打上了
09:00-09:30
把 C 的暴力打上了,还顺便把部分分的错找出来了
09:30-09:55
把 B 的暴力打上了,开始罚坐
10:30-11:00
D 写了一个 O(qnmlogm)的 3,4,5,但是常数巨大(或者算错了)极限数据测了一下会 G (希望是随机)
11:30
D 砍去了 log,常数大大减小
Result
70+20+20+50,B 贪心写炸了 −20,C 部分分挂了 −20。
Summary
-
得加快点写暴力的速度。
-
先想好怎么写再去写。
Problem
T1
T 组询问,每次给定 n=∏pici,其中 pi 为互异的质数,求 gcdci。
n≤1018,T≤104
Solution
枚举 gcd 为 k,k 为 log 级,若 kn 为整数则合法。
WHY?
n=p1c1p2c2…pqcq=(p1kc1p2kc2…pqkcq)k
若 k 为 gcdci,则有 kci∈Z,又因为 pi∈Z,故 p1kc1p2kc2…pqkcq∈Z。
时间复杂度 O(Tlog2n)。
T2
n 天要拿 m 件包裹,每个包裹第 li 天到货,第 ri 天之后过期,一次最多拿 k 件,一天内可往返多次,第 i 天往返一次的代价为 ci,最小化代价。
n,m≤4000,∀i=j,li≤lj→ri≤rj
Solution
排遍序,设 di,j 为 mink=ijck,fi 为拿走前 i 个的最小代价,故枚举之前的未过期的包裹,注意 k 的限制:
fi=minfj−1+dli,rj←max(1,i−k+1)≤j≤i,li≤rj
时间复杂度 O(n2+m2)。
T3
n×n 的棋盘,其中 imoddx=0 且 jmoddy=0 的点为坏点,一个点能移动到另一个点,当且仅当两点所成矩形中不含坏点,代价为矩形中数字最小值,求 (1,1) 到每个点的代价。
n≤300
Solution
对于每个极大互通子矩阵内枚举分界点,对于分出的四个块建立“进点”和“出点”,然后跑 Dijkstra。
时间复杂度 O(n2logn)。
T4
给出长度为 n 的序列 ai,q 次询问 [l,r] 内有多少个子序列的和为 x。
n,q≤105,1≤ai,x≤300
Solution
用猫树离线处理,对于当前的 l,r,先预处理出 mid 两边每个位置的背包信息,对于每个询问,若 li≤mid≤ri,则合并这两个背包得到答案,否则划分给 [l,mid] 或 [mid+1,r] 处理。
时间复杂度 O(nmlogn+q(m+logn))
满分做法过于人类智慧,不作解释。