2024 年二月做题记录

SCP-CN-3000,众结点永垂不朽。

CF338E

不妨设 \(b_i\le b_{i+1}\)

则一个子序列 \(z_1,z_2,\cdots,z_{len}\) 能够匹配的充要条件是

\(\forall i, cnt_{h-b_i}\ge n - i + 1\),其中 \(cnt_i\) 表示 \(\ge i\) 的数的个数。

离散化一下,然后维护个 \(c_i=cnt_i-Z\),区间加全局 \(\min\) 即可。

已实现。

CF1437G

建立 AC 自动机,需要实现修改边权和查询点到根边权最大值。

可以树剖,也可以标记永久化(每个节点维护一个 multiset)。

\(2\log\)

已实现。

P4917

对于一对 \((a, b)\),贡献为 \(\frac{\operatorname{lcm}^2(a,b)}{ab}\)

\(\prod_{a=1}^n\prod_{b=1}^m\frac{ab}{\gcd(a,b)}\)

只需要求出

\(\prod_{a=1}^n\prod_{b=1}^m\frac{1}{\gcd(a,b)}\) 即可。

\(\prod_{T=1}^{\min(n,m)}(\frac{1}{T})^{\sum_{i=1}^n\sum_{j=1}^m[\gcd(i,j)=T]}\)

\(\sum_{i=1}^n\sum_{j=1}^m[\gcd(i,j)=1]\) 的结论是

\(\sum_{i=1}^n\sum_{j=1}^m\sum_{d|\gcd(i,j)}\mu(d)\)

\(\sum_{d=1}^{\min(n,m)}\mu(d)\sum_{i=1}^n\sum_{j=1}^m[d|\gcd(i,j)]\)

\(\sum_{d=1}^{\min(n,m)}\mu(d)\lfloor\frac{n}{d}\rfloor\lfloor\frac{m}{d}\rfloor\)

整除分块即可。

已实现。

P5300

按位考虑,即求一个大矩形内全 \(0/1\) 矩阵的个数。

这是可以单调栈做到 \(\mathcal{O}(n^2)\) 的。

已实现。

P5492

\(f_{i,S}\) 意义为当前排列长度为 \(i\),其中选的点以及它们的邻域的集合为 \(S\)

\(g_S\) 为当前文所述的集合为 \(S\) 时最大独立集的大小。

转移分两种。\(S\) 外新选一个点和 \(S\) 内选。

\(S\) 外选一个点时转移当且仅当 \(g_S+1=g_T\)

\(\mathcal{O}(n^22^n)\)

似乎可以通过丢掉 \(i\) 来做到更好的复杂度。指 \(\frac{1}{n}\)

已实现,为 \(\mathcal{O}(n2^n)\) 解法。

CF1904E

sol.1

考虑当 \(x\) 固定的情况下咋样。

\(dep\) 拍到 \(dfn\) 上,然后每次合并最多 \(k+1\) 个区间即可。

然后换根 dp,用线段树维护 \(dep\)

sol.2

考虑 \(\max(dis(x,i))\)\(i\) 一定在子连通块上直径的某个端点。

线段树维护直径。

P10060

\(f_i\) 为颜色,则它们应当在树上形成若干不相交连通块。
显然,一个连通块只能对应一个 \(a_i\)

设 dp 状态 \(dp_{i,j}\) 表示连通块 \(i\),距离 \(i\) 最顶端的点的连通块核心为 \(j\) 的方案数。

然后随便做做就行了。

CF1207F

同 P3396。

已实现。

CF1548C

读了题解。

\(\binom{3i}{j}\) 可以理解成 \([x^j](1+x)^{3i}\)

于是答案为 \([x^j]\sum_{i=0}^{n}(1+x)^{3i}\)

\(S(n)=\sum_{i=0}^n a^{3i}\)

\(a^3S(n)-S(n)=a^{3(n+1)}-1\)

\(S(n)=\dfrac{a^{3n+3}-1}{a^3-1}=\dfrac{(1+x)^{3n+3}-1}{x^3+3x^2+3x}\)

跑一个叫啥,大除法的东西。

已实现。

P6189

\(a_1 + a_2 + a_3 + \cdots + a_m=n\),则 \(>\sqrt{n}\) 的数最多有 \(\sqrt{n}\) 个。

根号分治。

  • \(\le \sqrt{n}\)
    直接跑完全背包

  • \(> \sqrt{n}\)
    \(f_{i, j}\) 表示用了 \(i\) 个物品,\(\sum a\)\(j\) 的方案数,前缀和优化转移。
    \([x^n]\prod_{i>\sqrt{n}}(1+x^{i}+x^{2i}+\cdots)\)
    rnm我被打爆了,看题解了。

最后求卷积结果的单点,暴力做就行了。

已实现。

CF741E

通过 \(\mathcal{O}(n\log n)-\mathcal{O}(1)\) 后缀数组 + ST 表可以处理出任意两个后缀的 LCP,进而可以 \(\mathcal{O}(1)\) 比较两个子串的 Hash 值。

\(S\) 中插入 \(T\),拆开来就是 \(S\) 的前缀 \(+ T + S\) 的后缀。

\(S\)\(T\) 拼在一起预处理,就可以 \(\mathcal{O}(1)\) 比较 \(s_i\)\(s_j\) 的大小。

题目转化为 \(\min v_i(l\le i\le r, i\equiv a\pmod b)\)

根号分治,对于 \(>B\)\(b\) 转化个 \(\frac{n}{b}\) 个 RMQ 问题。

\(\le b\) 的部分开桶做一个预处理也做完了。

\(\sout{n\sqrt{n}}\)

突然想到预处理 ST 表要加个 \(\log\),于是是 \(n\sqrt{n\log n}\)

已实现。

CF1284E

被 LHQ 打爆了。

对于一个点,把其他点对它极角排序,然后双指针维护区间。

容斥一下,\(n^2\log n\)

已实现。意外的简洁啊。

XSY2024GDOI 21B

降智。

扫描线维护队列,然后转化成插入/删除,求前缀区间 \(\max\)

使用线段树维护即可。

降智?降智!

已实现。

CF1717F

首先对于每一个 \((u,v)\)\(a_u\gets a_u + 1,a_v\gets a_v+1\),然后选一个 \(-2\)

建模 \(S-S'(m)\),对于每一个 \((u,v)\) 连边 \(S'-p(1),p-u(1),p-v(1)\)

然后对于每一个 \(i\),若 \(s_i=1\) 则连边 \(i-T(z)\),否则 \(i-tmp(1)\)

\(tmp-T(m-tot)\)

跑最大流。

已实现。

P7603

减半警报器。

已实现。

P7606

结论 \(1\):在平面上随机游走 \(n\) 步,中间过程的绝对值在 \(k\sqrt{n}\) 内的概率为 \(4ne^{-k^2/6}\)

在二维平面上直接乘个 \(n\),不是游走 \(n\) 步而是确定共 \(n/2\)\(+1\)\(n/2\)\(-1\) 再乘个 \(n\)

由于 \(k\) 在指数上其实没多大影响。\(k\) 大概在 \(\mathcal{O}(\sqrt{\log n/ eps})\) 左右。

这个界很松,实际上取 \(k=2\) 没什么问题的。

参考资料

已实现。

P.S. 这是我的第 500 紫。

XSY2024GDOI 22B

参考题解。模型挺好的。

顺带一提,连边 \(S-x-T\)\(+\inf\) 原因是钦定只能割一条。不加也能过我不是很理解。

已实现。

ABC218H

\(f(R)\) 为点亮 \(R\) 盏红灯的最优解。

很难发现 \(f\) 是凸函数,除非你去讨论区看到 wqs 三个字。

然后就 wqs 二分即可。

已实现。

CF1430F

greedy 把我打爆了。

假如你在某一个时刻选择了换弹夹,则这之后的策略和这之前就没关系了。

考虑过程大概是,子弹越来越少,然后换弹夹。

这个换弹夹的时间是越往后越好。

越往后剩的越少,浪费的也就越少。

提前换和后面换的差别最多是 \(a\) 所以不优。

已实现。

CF1530F

我们可以枚举 \(\{行,列,对角线\}\) 的子集,然后容斥出答案。

这样复杂度是 \(2^{44}\),我猜过不去吧。

考虑仅枚举行和对角线。看看列怎么处理。

\(\sum\limits_{T\subset 行,对角线}\sum\limits_{S\subset 列} f(T \cap S)\times (-1)^{|T|+|S|+1}\)

这个东西,首先把 \(T\) 中强制需要亮的东西乘起来。

之后每一列都有一个选择的代价 \(v_i\),它们互不相同干涉。

这个就可以直接 \(\mathcal{O}(n)\) dp 了。

复杂度 \(\mathcal{O}(2^{n+2}n)\)

已实现。

P9047

\(f_{u,0,1,2,3}\) 表示 \(u\) 下面挂了 \(0/1/2/3\) 个点,和那些 \(4-不相交链\) 的边权的总和。

转移:

  • \(f_{u,0}\)\(f_{v,3}\)\(f_{v,2}+f_{v,0}, f_{v,1}+f_{v,1}\)\(f_{v,0}\) 的组合。
  • \(f_{u,1}=\sum{f_{v,0}}+\max(w)\)
  • \(f_{u,2}=\sum{f_{v,0}}+\max(w+f_{v,1}-f_{v,0})\)
  • \(f_{u,3}=\sum{f_{v,0}}+\max(w+f_{v,2}-f_{v,0})\)

除了 \(f_{u,0}\) 都可以做到 \(\mathcal{O}(1)\)

以上转移 \(f_{u,1},f_{u,2},f_{u,3}\) 都是假的,应该参照 \(f_{u,0}\) 进行转移。

打乱儿子后,\(f_{u,0}\) 可以看做在二维平面上随机游走,那套用 P7606 的结论,扔个 \(\sqrt{n}\) 进来即可。

已实现。

CF850F

设当前局面的势能函数 \(\Phi(X)=\sum f(a_i)\)

则我们希望 \(E(\Phi(X_{i})-\Phi(X_{i-1}))=1\)

算了 \(\LaTeX\) 太烦了手写了

先这样在那样

然后得到 \(\sum_{i=1}^n a_i^2(f(a_i-1)+f(a_i+1)-2f(a_i))=sum\)

不妨假定 \(a_i(f(a_i-1)+f(a_i+1)-2f(a_i))=1\)

\(g(x)=f(x)-f(x-1), g(0)=f(0)=0\)

则有 \(\frac{sum-a_i}{sum-1}(g(a_i+1)-g(a_i))=1\)

\(g(x+1)-g(x)=\frac{sum-1}{sum-1+x}\)

已实现。

CF1349D

同样是把公式写在纸上了。

经过一番阿巴阿巴的操作,得到 \(\sum sum\times g(a_i+1)-a_i((n - 1)g(a_i)+g(a_i+1))=sum(n-1)\)

直接拿这个推 \(f,g\) 就做完了。

然后搞完了。

XSY2024GDOI 26B

先考虑如何判定一个序列 \(a\) 是好的。

\(f(i,0)\) 表示对于前缀 \([1, i]\),钦定 \(a_i\) 不选,最大独立及 \(\times 2-\sum a_i\) 的值。

类似,定义 \(f(i,1)\) 表示钦定 \(a_i\) 必选。

则有递推式

\(\begin{cases}f(i,0)=\max(f(i - 1, 0), f(i - 1, 1))-a_i\\f(i,1)=f(i - 1, 0)+a_i\end{cases}\)

根据题目要求,我们应该有 \(f(n,0) \le 0, f(n, 1) \le 0\)

观察到 \(f(i,0)+f(i,1)\ge f(i-1,0)+f(i-1,1)\),又因为 \(f(0,0)+f(0,1)=0\)

所以

对于所有 \(i\),都有 \(f(i,0)+f(i,1)=0\)

注意到 \(a_i>0\),于是一定有 \(f(i,1)\ge 0\)

\(s=f(i,1)\),则判断条件为阿巴阿巴。

XSY2024GDOI 27C

https://www.luogu.com.cn/blog/366338/cong-lin-mao-xian-adventure

P4590

本质上属于状压 dp 中的一种。

考虑如何求最长公共子序列?

\(f(i, j) = \max(f(i - 1, j), f(i - 1, j - 1) + 1, f(i, j - 1))\)

只和 \(f(i - 1, *)\) 有关。

考虑状态压缩,由于 \(f(i,a)-f(i,a-1)\le 1\),可以考虑状压差分后的 \(01\) 数组。

复杂度 \(\mathcal{O}(2^K\operatorname{poly}(n,k))\)

已实现。

现在 | 将来
posted @ 2024-06-03 21:31  fjy666  阅读(4)  评论(0编辑  收藏  举报