日记

日记

Wed Jul 16 2025
3 分钟

以我的码力,一个晚自习改出三道 NOIP+ 还是太难了点。

能不看 std 写出来还能过就很不错了,就是实现太优秀了点

T1 Link to

赛时发现是容斥。也就发现是容斥了

dpi,jdp_{i,j} 表示前 ii 个家族里钦定有 jj 个投了自己家。转移类似背包:dpi,j=k=0min(j,leni)dpi1,jk×gkdp_{i,j} = \sum_{k = 0}^{\min(j,len_i)}dp_{i - 1,j - k} \times g_k。其中 gkg_k 是在枚举每个家族时分别处理的,表示当前家族如果有 kk 个投了自己人的方案数。lenilen_i 表示家族 ii 的大小,

考虑如何求 gkg_k。设 fi,jf_{i,j} 表示当前家族前 ii 个人有 jj 票投了自己人。那么有 gk=flen,jg_k = f_{len,j},这下只用求 fi,jf_{i,j} 了。有 fi,j=k=0min(j,ci)fi1,jk1(cik)!(lenj+kk)f_{i,j} = \sum_{k = 0}^{\min(j,c_i)}f_{i - 1,j - k} \cdot \frac{1}{(c_i - k)!}\binom{len - j + k}{k}

然后容斥一下:ans=i=0n(1)i×dpm,i×(ni)!ans = \sum_{i = 0}^{n}(-1)^i \times dp_{m,i} \times (n - i)!

T2 Link to

我们对每个 aia_i 分别考虑它所需的步数,那么题意就变成了 aia_i 所需的步数的最大值最小,直接开始二分。

考虑如何 chk 二分出来的 midmid。要使 aa' 单调不降,aia'_i 必须 ai1a'_{i - 1}。设当前 ai=lsta'_i = lst。暴力枚举 lst,lst+1,lst+2,lst,lst + 1,lst + 2,\dots。看看 aia_i 能不能在 midmid 次变成 lst+xlst + x。发现每次要么成功,要么 lst+1lst + 1,而 lst>mlst > m 的时候又非法了,所以这种方法的复杂度是 O((n+m)×检查的复杂度O((n + m) \times \text{检查的复杂度}

发现 n106n \le 10^6,所以不能双 log\log。而我们的二分已经用了一个 log\log,所以我们的检查复杂度必须是 O(1)O(1) 的。发现 bb 可以建模成一个基环内向树。我们预处理每个点:所在联通块的编号;树根编号;深度;设我们要求 sts \to t 的距离:

  • 在同一联通块
    • tt 在环上
      距离为 depv1+(rnktrnkroots+len)modlendep_v - 1 + (rnk_t - rnk_{root_s} + len) \bmod len
    • tt 不在环上
      • ttss 的祖先(需要奇技淫巧)
        距离为 depsdepvdep_s - dep_v
      • tt 不是 ss 的祖先
        return inf;
  • 不在同一联通块
    return inf;

然后这题就做完了。复杂度 O((n+m)logm)O((n + m) \log m)

后日谈 Link to 后日谈

其实 T2 不算太难。就是那个 O(n+m)O(n + m) 的判断有点沟槽。

码力还得再练,不过是比之前强了。