早上模拟赛。第一题题目边反了。。。
下午补题,学会了树状数组维护三阶前缀和。
晚上也补题,补完了。zsw 在机房唱了一晚上的歌,强烈谴责。
以下题解
T1:分层图最短路。
T2:dp 然后优化。
设 dpi,j=0/1 表示是否有末尾数 <i,异或和为 j 的子序列。对于具体的数,其实不用关心。
假设现在处理 ai,枚举异或和 j,那么所有 dpk,jxorai∣ai<k<V,dpj=1 都会被更新。
下面优化:
-
对于相同的异或和,如果 fi,… 已经被更新,那么 fi+1∼V,… 都被更新了,我们设立数组 Mi Mi+1∼V 无需枚举。
-
第二维的枚举太慢了,假如都是每个状态都是 0,就浪费时间。可以设一个 fi,j,记录异或和为 i 时要枚举哪些 j 值。更新完就全部删除。
提交记录
T3:
对每值相同的数 x 进行讨论。

发现只要出现了 x,都会被分成公差为 −1 的等差序列。记录 si 为 x 在 a1∼i 出现次数。判断子串 i+1∼j 合法的式子:2(si−sj)>r−l,让它对称一点,得: 2si−r>2sj−l。变成求顺序对。一个个求的话显然太慢,倘若一次处理一个区间就好了。
用权值树状数组搞。
因为一段是一个等差序列。所以可以用差分加,Cj 表示每个值的个数。用一个前缀和 Si=∑j=1iCj。也就是 ≤i 的数个数。一段中每个值的贡献,Di=∑j=1iSj。
Di−1−Dj−1−1 即为所求。这么算下来,我们需要区间修改,求二阶前缀和。通过差分变成单点修改,求三阶前缀和。推式子得到:
Di=2(i2−3i)ai−2xiai+(x2+3x+2)ai
所以我们要维护有 i 的地方,即三个树状数组。
提交记录
T4:值域太大,直接统计不行。一位位讨论应是更加选择。设现在讨论第 i 位,即权值为 10i−1 的位,更高位没必要讨论。所以先 mod10i。
我们只要考虑该位上的最大值。先每次暴力选数,然后加优化。
现在从小到大有三个状态 x,y,z。如果 z−x≤10i−1 那就可以舍去 y。证明:在最高位上,包括 z 的与包括 x 的选商品策略的钱数和最多相差 1。而包括 y 的策略必与包括 x,y 策略中至少其一相同。
最多十种状态。复杂度 O(nlogV)
提交记录