日记

日记

周二 10月 14 2025
1560 字 · 7 分钟

连着 44 天没更日记,这下可有的写了。

灾后重建↗

我们考虑对于 tt 扫描线。题目里给定 tt 是单调不降的,所以我们甚至不用离线。设我们现在扫描到的 tt,当前在处理村庄 uu,满足村庄 uu 在 tt 时刻通车。

我们发现 nn 十分的小啊,所以考虑 Floyd。我们处理 uu 的时候,拿 uu 松弛一下就行了。

Protect the school↗

其实就是一道 tarjan 强连通板子题。

Bit Counting Sequence↗

我们记录 valval 表示当前确定的值,kk 表示当前确定的位数。

当我们循环到 aia_i 时,设 x=ai−1−ai+1x = a_{i - 1} - a_i + 1,我们发现 xx 就是它进的位数。于是我们就可以确定在 i−1i - 1 处 valval 的第 [0,x)[0,x) 位都是 11 了。于是我们就依次可以确定 valval,如果发现 valval 已经确定的在 [0,x)[0,x) 之间的位置不全是 11 就说明不对,无解。

Help Yourself G↗

将线段按照左端点排序。设 dpidp_{i} 表示前 ii 条线段所组成的集合的复杂度之和。

考虑如何转移。我们发现:第 ii 条线段可选可不选,于是就有一个 2×dpi−12 \times dp_{i - 1}。那么选它对于复杂度的影响呢?它会对所有的 rj<lir_j < l_i 的 jj 组成的集合都会造成 11 的贡献,设有 xx 个 jj,那么就会造成 2x2^x 的贡献。

所以我们有 dp 方程:dpi=2×dpi−1+2xdp_i = 2 \times dp_{i - 1} + 2^x,xx 可以用桶 + 前缀和预处理,时间复杂度 O(n)O(n)。

迎接仪式↗

这道题的 dp 状态设的也是十分神秘啊。

设 dpi,j,k,pdp_{i,j,k,p} 表示循环到了第 ii 位,改了 jj 个 j\texttt{j},kk 个 z\texttt{z},当前这位改过后是 j\texttt{j} 还是 z\texttt{z} 的最大子串数量。统计答案:ans=max⁡i=0Kmax⁡{dpn,i,i,0,dpn,i,i,1}ans = \max_{i = 0}^{K}\max\{dp_{n,i,i,0},dp_{n,i,i,1}\}。

考虑如何转移。

  • 这一位本来是 j\texttt{j}
    • 不改
      那么这一位也不可能和前面组成 jz\texttt{jz} 子串,所以有 dpi,j,k,0←max⁡(dpi−1,j,k,0,dpi−1,j,k,1)dp_{i,j,k,0} \gets \max(dp_{i - 1,j,k,0},dp_{i - 1,j,k,1})。
    • 改
      这一位就可以和前面一位组成 jz\texttt{jz} 子串了,有 dpi,j,k,1←max⁡(dpi−1,j−1,k,0+1,dpi−1,j−1,k,1)dp_{i,j,k,1} \gets \max(dp_{i - 1,j - 1,k,0} + 1,dp_{i - 1,j - 1,k,1})。
  • 这一位本来是 z\texttt{z}
    • 不改
      同理:dpi,j,k,1←max⁡(dpi−1,j,k,0+1,dpi−1,j,k,1)dp_{i,j,k,1} \gets \max(dp_{i - 1,j,k,0} + 1,dp_{i - 1,j,k,1})。
    • 改
      同理:dpi,j,k,0←max⁡(dpi−1,j,k−1,0,dpi−1,j,k−1,1)dp_{i,j,k,0} \gets \max(dp_{i - 1,j,k - 1,0},dp_{i - 1,j,k - 1,1})。

这题最神秘的地方就在于这个神秘的状态设定。

一个关于序列的游戏↗

区间 dp 好题。

设 dpi,jdp_{i,j} 表示区间 [i,j][i,j] 能获得的最大价值。有显然的转移:dpi,j=max⁡k=ij−1dpi,k+dpk,jdp_{i,j} = \max_{k = i}^{j - 1}dp_{i,k} + dp_{k,j}。但是对于那写最初并非在一起的区间呢?

我们考虑如何处理这些区间。设 upi,jup_{i,j} 表示将 [i,j][i,j] 变成一个单调递增的合法区间的最大价值,dni,jdn_{i,j} 表示将 [i,j][i,j] 变成一个单调递减的的区间的最大价值。那么我们有 calc(l,mid,r)calc(l,mid,r),表示求 [l,r][l,r],峰在 midmid 的最大价值:

int calc(int l,int mid,int r)
{
int len = (a[mid] << 1) - a[l] - a[r] + 1;
if (a[mid] < a[l] || a[mid] < a[r] || len > n)
return -inf;
return up[l][mid] + dn[mid][r] + v[len];
}

那么我们的转移又要加一个:dpi,j=max⁡k=ijcalc(i,k,j)dp_{i,j} = \max_{k = i}^{j}calc(i,k,j)。

如何维护 upup 和 dndn 呢?

  • 维护 upup
    我们发现只有在 ai−1+1=aj+1a_{i - 1} + 1 = a_{j + 1} 的时候,才可以进行转移。所以有:
if (a[i - 1] + 1 == a[j + 1])
for (int l = 1; l < i; l++)
for (int r = j + 1; r <= n; r++)
up[l][r] = max(up[l][r],up[l][i - 1] + up[j + 1][r] + dp[i][j]);
  • 维护 dndn
    同理:
if (a[i - 1] - 1 == a[j + 1])
for (int l = 1; l < i; l++)
for (int r = j + 1; r <= n; r++)
dn[l][r] = max(dn[l][r],dn[l][i - 1] + dn[j + 1][r] + dp[i][j]);

总时间复杂度 O(n3)O(n^3).

数列↗

唐成啥了。

设 dpi,j,k,pdp_{i,j,k,p} 表示正在处理二进制下的第 ii 位,有 jj 个数已经确定值了,总共有 kk 个 11,要往下进 pp 位的权值和。

考虑填表法转移。设要给 xx 个数赋 ii,那么 jj 肯定是变成 j+xj + x 了,kk 变成 k+[(x+p)mod  2]k + [(x + p) \mod 2] 了,pp 变成 p+⌊x+p2⌋p + \lfloor \frac{x + p}{2} \rfloor 了。

那么贡献呢?显然,加上 xx 个 ii 会在 (n−jx)\binom{n - j}{x} 中情况里造成 vixv_i^x 的贡献。所以有转移方程:dpi+1,j+x,k+[(x+p)mod  2],p+⌊x+p2⌋←dpi,j,k,p×vix×(n−jx)dp_{i + 1,j + x,k + [(x + p) \mod 2],p + \lfloor \frac{x + p}{2} \rfloor} \gets dp_{i,j,k,p} \times v_i^x \times \binom{n - j}{x}。

最终的答案呢?我们已经处理完了 mm 位,所以正在处理的应当是 m+1m + 1 位。而我们填完了 nn 个数,要 k+popcount(p)≤Kk + \text{popcount}(p) \le K 时就统计进答案,所以有 ans=∑k=0K∑p=0⌊n2⌋[k+popcount(p)≤K]dpm+1,n,k,pans = \sum_{k = 0}^{K}\sum_{p = 0}^{\lfloor \frac{n}{2} \rfloor}[k + \text{popcount}(p) \le K]dp_{m + 1,n,k,p}。

金字塔↗

太唐了不写了。

Rectangles↗

我们钦定 n≤mn \le m(如果不是的话转置一下就是了)。然后枚举 u,du,d 表示矩阵的上下边界,枚举 i∈[1,m]i \in [1,m],如果有 mpu,i=mpd,imp_{u,i} = mp_{d,i},我们就把 (u,d,lst,i)(u,d,lst,i) 这个矩阵标记出来,并将 lstlst 置为 ii。

然后我们对于第 k∈[1,m]k \in [1,m] 列进行区间 dp。设 dpi,jdp_{i,j} 表示能覆盖 x∈[i,j],y=kx \in [i,j],y = k 的所有点的矩形最小是多大。那么有转移:dpi+1,j=min⁡(dpi+1,j,dpi,j),dpi,j−1=min⁡(dpi,j−1,dpi,j)dp_{i + 1,j} = \min(dp_{i + 1,j},dp_{i,j}),dp_{i,j - 1} = \min(dp_{i,j - 1},dp_{i,j})。但是实现太优秀了调了一上午也没调出来

Happy·Lovely· Everyday!↗

考完这场模拟赛,这辈子都不会想玩 pjsk 了。

我们发现,题意可以变成这个样子:把 aa 分成几个字串,都给替换成它的异或和,得到的数组记为 bb,求本质不同的 bb 的数量。我们发现,如果定义 ai′=⨁j=1iaia'_i = \bigoplus_{j = 1}^{i}a_i,bi′b'_i 同理,那么每个 b′b' 都对应一个 bb,而 b′b' 又一定是 a′a' 的字序列,那么就相当于求 a′a' 的本质不同的子序列的数量就是了。

敬启,致那时的我↗

神秘数位矩阵 dp。

后日谈

今天给 Frosti 更新了一下。

早上那叫一个颓废,我也不知道为啥这么颓废,多半是因为没做出来 T1 的缘故。

希望明天早上不要这样。


Thanks for reading!

日记

周二 10月 14 2025
1560 字 · 7 分钟