石门集训-20231108记录

早上模拟赛。第一题题目边反了。。。

下午补题,学会了树状数组维护三阶前缀和。

晚上也补题,补完了。zsw 在机房唱了一晚上的歌,强烈谴责。


以下题解

T1:分层图最短路。

T2:dp 然后优化。

dpi,j=0/1dp_{i,j}=0/1 表示是否有末尾数 <i<i,异或和为 jj 的子序列。对于具体的数,其实不用关心。

假设现在处理 aia_i,枚举异或和 jj,那么所有 dpk,jxoraiai<k<V,dpj=1dp_{k,j} \operatorname{xor} a_i|a_i<k<V,dp_j=1 都会被更新。

下面优化:

  • 对于相同的异或和,如果 fi,f_{i,\dots} 已经被更新,那么 fi+1V,f_{i+1 \sim V,\dots} 都被更新了,我们设立数组 MiM_i Mi+1VM_{i+1}\sim V 无需枚举。

  • 第二维的枚举太慢了,假如都是每个状态都是 00,就浪费时间。可以设一个 fi,jf_{i,j},记录异或和为 ii 时要枚举哪些 jj 值。更新完就全部删除。

提交记录

T3:

对每值相同的数 xx 进行讨论。

抄的图片

发现只要出现了 xx,都会被分成公差为 1-1 的等差序列。记录 sis_ixxa1ia_{1\sim i} 出现次数。判断子串 i+1ji+1\sim j 合法的式子:2(sisj)>rl2(s_i-s_{j})>r-l,让它对称一点,得: 2sir>2sjl2s_i-r>2s_j-l。变成求顺序对。一个个求的话显然太慢,倘若一次处理一个区间就好了。

用权值树状数组搞。

因为一段是一个等差序列。所以可以用差分加,CjC_j 表示每个值的个数。用一个前缀和 Si=j=1iCjS_i=\sum_{j=1}^{i}C_j。也就是 i\leq i 的数个数。一段中每个值的贡献,Di=j=1iSjD_i=\sum_{j=1}^{i}S_{j}

Di1Dj11D_{i-1}-D_{j-1-1} 即为所求。这么算下来,我们需要区间修改,求二阶前缀和。通过差分变成单点修改,求三阶前缀和。推式子得到:

Di=(i23i)ai2xiai+(x2+3x+2)ai2D_{i}=\frac{(i^2-3i)a_i-2xia_i+(x^2+3x+2)a_i}{2}

所以我们要维护有 ii 的地方,即三个树状数组。

提交记录

T4:值域太大,直接统计不行。一位位讨论应是更加选择。设现在讨论第 ii 位,即权值为 10i110^{i-1} 的位,更高位没必要讨论。所以先 mod10i\bmod 10^i

我们只要考虑该位上的最大值。先每次暴力选数,然后加优化。

现在从小到大有三个状态 x,y,zx,y,z。如果 zx10i1z-x\leq10^{i-1} 那就可以舍去 yy。证明:在最高位上,包括 zz 的与包括 xx 的选商品策略的钱数和最多相差 11。而包括 yy 的策略必与包括 x,yx,y 策略中至少其一相同。

最多十种状态。复杂度 O(nlogV)O(n\log V)

提交记录

posted @ 2023-11-08 21:40  cjrqwq  阅读(7)  评论(0)    收藏  举报  来源