2023年 9月 做题记录

CF1860F Evaluate RBS

考虑一个三元组的 \((a,b,c)\) 在特定 \((x,y)\) 下的权值 \(ax+by\) 的含义:发现它是向量 \((a,b)\) 和向量 \((x,y)\) 的点积.

由于有 \(\vec x \cdot \vec y=|\vec x||\vec y|\cos \langle \vec x,\vec y \rangle\).在 \((x,y)\) 变化的过程中,\(|(x,y)|\) 对于所有三元组是相同的.那么只有夹角会影响三元组的权值比较结果.而夹角和 \((x,y)\) 的辐角,也就是 \(x/y\) 相关.那么有做法:使 \(t=x/y\) 从小变大,在不同的 \(t\) 下判定最优情况是否可以构造合法的括号序列即可.

实现方法:预处理出每对可能的交换对应的 \(t\).按 \(t\) 从小到大依次执行它们.存在一个性质:当前 \(t\) 需要重排(涉及交换)的位置构成一个区间.可以通过画图模拟:

考虑 \(t\rightarrow t'\) 时若交换 \(a,b\),那么肯定有交换 \(a,b\)\(b,c\)

判定是否存在合法的括号序列可以判断前缀和没有 \(<0\) 的位置.那么我们维护前缀和中 \(<0\) 位置的个数.每次暴力重构一个区间的前缀和,并更新那个系数,最后观察其是否 \(=0\)

CF1685B Linguistics

首先判断,\(s\)\(A\) 的数量应当等于 \(a+c+d\)\(B\) 的数量应当等于 \(b+c+d\)

发现我们只需要在 \(s\) 中找出 \(c\)\(AB\)\(d\)\(BA\) 后自然可以满足要求:剩下的 \(A\)\(B\) 暴力拆分就行了.

然后我们可以考虑 \(s\) 中每一个极长的 \(AB\) 交替出现的段落,其可以分成一下四种情况:

  1. \(ABA\cdots BA\)
  2. \(ABA\cdots AB\)
  3. \(BAB\cdots BA\)
  4. \(BAB\cdots AB\)

设一个这样的段落 \(t\) 长度为 \(l\)

  • \(t\) 的两边字符相同的时候.也就是上面的情况 \(1\)\(4\).可以发现其在最优利用的情况下,拆分 \(AB\)\(BA\) 的数量之和一直为 \(\lfloor l/2\rfloor\)

  • \(t\)\(A\) 开头,以 \(B\) 结尾.也就是上面的情况 \(2\).当其仅用来拆分成 \(AB\) 时,拆出来的数量为 \(l/2\).否则拆分出的 \(AB\)\(BA\) 的数量和为 \(l/2-1\)

  • \(t\)\(B\) 开头,以 \(A\) 结尾.情况于上面类似.

考虑先凑出所有的 \(AB\),再去凑 \(BA\).首先肯定用第 \(2\) 类串.然后再用 \(1,4\) 类串,然后在用第 \(3\) 类串.在使用第 \(2\) 类串的时候需要从短的串开始用起,可以减少 \(BA\) 串可能的浪费.在使用 \(3\) 类串的时候从长的串开始用起,减少自己的浪费.

CF140C New Year Snowmen

每次贪心选数量最多的 \(3\) 个.模拟选择过程直到不能选择位置.

正确性证明:感性理解一下,操作时尽量保留不同大小雪球种类数较多较好,而贪心选最多数量的 \(3\) 种,保留的种类数是最多的.

CF79D Password

考虑原序列的差分序列.最终状态的差分序列是可以确定的.而其中为 \(1\) 的位置不超过 \(20\) 个.考虑逆推:使用最少的操作步骤使得从最终的差分序列恢复到全 \(0\) 的差分序列.我们可以考虑设计状压 DP.

如何转移?考察操作在差分数组上的作用:在 \(i\) 位置取反,在 \(i+k\) 位置取反.不妨分类讨论:

  • \(i\) 位置和 \(i+k\) 位置都是 \(1\).可以视作 \(i\) 移动到了 \(i+k\),然后两个 \(1\) 抵消了.

  • \(i\) 位置和 \(i+k\) 位置都是 \(0\).无意义的操作.

  • \(i\) 位置和 \(i+k\) 位置一个是 \(0\),一个是 \(1\).这时可以视作 \(i\)\(i+k\) 位置的一个 \(1\) 跑到了对面去.

那么可以这样转移:选择当前两个差分数组中为 \(1\) 的部分,试图让它们抵消.代价可以通过最短路预处理.

CF1684D Trap

首先使用全部的跳跃肯定比不用完更优.假设不使用完,我们在最后的几个位置使用跳跃答案肯定更优.

在一个位置 \(i\) 进行跳跃,对答案的减小量 \(\Delta_i\)\(a_i-(n-i)\).考虑按 \(\Delta_i\) 排序之后取最大的前 \(k\) 个.但是我们发现,似乎如果我在 \(i\) 位置跳跃后继续在 \(j(j>i)\) 位置跳跃,\(\Delta_i\)的计算中不需要考虑 \(j\) 位置额外增加的代价.
但其实对于任意一种选择 \(k\) 个跳跃位置的方案,\(\sum\Delta_i\) 中少计算的减小量是一样多的.

P3506 [POI2010] MOT-Monotonicity 2

非常神奇的题目.

有一个结论:对于每个位置,只需要保留到它为止最长能匹配的长度转移.然后就可以进行树状数组优化转移.

证明:
\(f_i\) 表示一个位置匹配的最长长度.我们需要说明对于任意一个位置 \(i\)\(f_i\) 都可以由某个 \(j(j<i)\)\(f_j\) 转移而来的.

考虑反证法,我们记 \(n\) 是第一个不满足上述性质的位置.我们设其从 \(m\) 位置的非最长匹配序列转移来.那么有 \(f_m\ge f_n\).设 \(f_m\) 代表的序列为 \(b_1,b_2,\cdots b_{f_m}\).有 \(b_{f_m}=a_m\)

  1. \(a_m=a_n\)

    这是我们可以直接从 \(b_{f_m-1}\) 对应的位置转移到 \(n\).记这个位置为 \(j\).由于 \(n\) 是第一个不满足性质的位置,所以一定有 \(f_j=f_m-1\).矛盾.

  2. \(a_m<a_n\)

    1. \(b_{f_n-1}<a_n\).这时可以从 \(b_{f_n-1}\) 对应的位置转移到 \(n\).同之前所说的原因矛盾.

    2. \(b_{f_n-1}\ge a_n\).我们在 \(b\) 中向后找到一个满足 \(b_j<a_n\) 的位置 \(j\).显然这个位置一定是可以找到的,因为 \(b_{f_m}=a_m<a_n\).我们从 \(b_j\) 对应的位置转移到 \(n\).显然 \(j\ge f_n\).那么答案还会更优,显然矛盾.

  3. \(a_m>a_n\)

    同上一样.

P7386 「EZEC-6」0-1 Trie

设计 \(f_{i,j,0/1}\) 表示包含 \(i\)\(1\)\(j\)\(0\),以 \(0/1\) 为根的 Trie 树节点个数.

存在转移:

\[\begin{aligned} f_{i,j,0}&=f_{i-1,j-1,0}+f_{i-1,j,1}+1\\ f_{i,j,1}&=f_{i,j-1,0}+1 \end{aligned} \]

\(f_{i,j,1}\)\(f_{i,j-1,0}+1\) 带入后,可以得到 \(f_{i,j,0}\) 的递推式:

\[f_{i,j,0}=f_{i-1,j-1,0}+f_{i-1,j-1}+2 \]

\(g_{i,j}=f_{i,j}+2\).有

\[g_{i,j}=g_{i-1,j}+g_{i-1,j-1} \]

它符合组合数的递推式.启示我们最后的答案可以通过组合数表达.

CF1796D Maximum Subarray

提供一种时间复杂度与 \(k\) 无关的线性做法.

假设 \(x\) 为正数.先将所有 \(a_i\)\(-x\)\(k\)\(+x\) 的位置就可以表示成 \(+2x\).我们肯定会贪心地将 \(k\)\(2x\) 尽可能地加到我们选择的子区间中区.

假设我们选择的子区间为 \([l,r]\),我们不妨假设将后 \(\min(r-l+1,k)\) 个位置 \(+2x\).不妨设 \(p=r-\min(r-l+1,k)\).这样看的话可以将子区间分成两段:\([l,p],[r-p+1,r]\).枚举 \(p\),考虑如何求出对于当前 \(p\) 最优的子区间.

\(p\) 前面的部分可以使用最大子段和的贪心.记 \(s_i=\sum_{j\le i}a_j\)\(p\) 后面的部分的决策可以写成:

\[\min_{p<j\le p+k}(s_j+2xj)-(s_p-2xp) \]

由于 \(j\) 对于任意 \(p\) 的取值区间是固定的,那么可以单调队列优化转移.

\(x\) 为负数时,考虑使 \(-x\rightarrow x,n-k\rightarrow k\).即可以同 \(x\) 为正数时一样讨论.

CF1553D Backspace

不妨从后往前考虑:
设当前匹配了 \(T\)\(p\) 位置之后的部分,现在尝试去匹配 \(T_p\)

\(S_i\neq T_p\) 时,\(S_i\) 必须按下 backspace.当 \(S_i = T_p\) 时,显然这一位匹配是优的.考虑不使 \(S_i\)\(T_p\) 匹配,则一定有 \(S_j(j<i)\)\(T_p\) 匹配.在 \(T_{p-1}\) 匹配位置之后到 \(i-1\) 为止,\(S\) 中需要删除的位置个数相同,而 \(S_j\)\(T_p\) 匹配还需要要求保留 \(j\) 位置.故可以贪心匹配.

P9575 「TAOI-2」喵了个喵 Ⅳ

鬼畜构造.

  • \(n\) 为偶数.令 \(x=1\).将 \(n\) 分成大小相等的两半.

  • \(a_i\) 为奇数.当 \(n\) 为偶数时按上述构造.当 \(n\) 为奇数时无解.考虑 \(2 \nmid a_i\),故 \(2 \nmid \gcd(a_i,x)\).由于两边分配的 \(a_i\) 个数一定为一奇一偶,故 \(\gcd\) 的和也一定是一奇一偶.不可能相等.

考虑正解.

我们将每个 \(a_i\) 写成 \(a'_i \times 2^{k_i}\)\(x\) 写成 \(x' \times 2^{k_x}\),并使得 \(2 \nmid a'_i, x'\).那么 \(\gcd(a_i, x)=\gcd(a'_i, x')2^{\min(k_i, k_x)}\).比较两边时,可以将所有 \(\gcd(a_i, x)\) 都除以 \(2^{\min(k_i(1 \le i \le n), k_x)}\).那么情况是,当 \(\min\) 取到 \(k_x\) 时,所有 \(\gcd(a_i, x)\) 都为奇数,显然无解.故 \(\min\) 取到 \(\min(k_i)\)

不妨设 \(b_i=a_i/2^{\min{k_i}}\)

  • \(b_i\) 中存在奇数个奇数时,其加和势必为奇数,故无解.

  • \(b_i\) 中存在偶数个奇数时,考虑构造 \(x=2^{\min{k_i}+1}\).这是问题变成了有偶数个 \(1\),和奇数个 \(2\),是否可以将其分成加和相等的两半.显然是可以的.

CF1861F Four Suits

对于一个人 \(x\) 答案怎么求?

考虑枚举其牌最多的花色 \(i\).可以证明,贪心地分配给他最多的 \(i\) 花色的牌是优的.假设 \(x\)\(i\) 花色的牌分发出去一张与人交换,至多使得某个人最多的牌的数量少 \(1\),而答案不会更优.

那么如何求出给 \(x\) 分配 \(i\),这种状态下其他人的最多的牌的数量的最小值呢?

首先二分答案 \(\lambda\).考虑构建网络流模型判定答案是否合法.左部点和源点相连,边权为 \(ned_i=K-\sum_{j=1}^{4}a_{i,j}\),代表除了 \(x\) 以外的 \(n-1\) 个人每个人还需要的卡片数量;右部四个点和汇点相连,边权为 \(b'_i\),代表四种花色的剩余牌数.左部点 \(i\) 和右部点 \(j\) 的连边边权为 \(\lambda-a_{i,j}\).我们需要判定这张图的最大流是否为 \(\sum_{i \neq x}ned_i\)

由最大流等于最小割,我们尝试找到这张图的最小割.

暴力枚举右部点和汇点连边的割集 \(S\),共有 \(2^4=16\) 种.考虑在一种给定 \(S\) 下左部点和源点,左部点和汇点的割集如何选择最优.发现对于左部点 \(i\),当 \(ned_i<\sum_{j\notin S}\lambda-a_{i,j}\) 时选择割掉和源点的连边 \(ned_i\),否则割掉和所有未割掉右部点的连边.这个决策奇妙地对于每个 \(i\) 是独立的.然后就有了一个 \(O(n^2\log n)\) 的做法.

如何优化:关键在于减少求出最小割的时间.

回归那个决策割集方案的不等式上:

\[\begin{aligned} ned_i&<\sum_{j \notin S}\lambda-a_{i,j}\\ ned_i&< \left| \overline S \right| \lambda-\sum_{j \notin S}a_{i,j}\\ ned_i+\sum_{j \notin S}a_{i,j}&< \left| \overline S \right| \lambda \end{aligned} \]

发现我们只需要对于每个特定的 \(S\),按 \(ned_i+\sum_{j \notin S}a_{i,j}\) 排序即可.然后每次求最小割就可以二分快速找到一个分界点.

很有启发性的一道题,让我知道在二分图左右部某一部节点个数极小时可以暴力枚举那一个割集来求最小割.

CF1764E Doremy's Number Line

\(1\) 位置单独考虑.当 \(k \le a_1\) 时,显然可以通过将 \(1\) 位置使用第一种操作直接满足.当 \(k> a_1\) 时只用第一种操作满足不了,我们需要通过 \(2 \sim n\) 位置凑出一个染过颜色的位置 \(y\),满足 \(y<a_1,y+b_1 \ge k\).有若干位置可以染色的区间一定是数轴上的一段前缀,那么我们只需要判定,\(2 \sim n\) 位置能染色的最右端位置是否 \(\ge k-b_1\) 即可.

问题变成了:求出 \(2 \sim n\) 位置染色的右端点 \(r\) 的值.

我们设 \(2 \sim n\)\(a_i\) 最大的位置为 \(p\).分两种情况:

  • 右端点不由 \(p\) 取到.不妨将 \(p\) 放在前面,这样其他所有位置的前面都被覆盖过颜色.这时的答案为 \(\max(a_i+b_i)(i \neq p)\)

  • 右端点由 \(p\) 取到.不妨将 \(p\) 放在最后面,并使得前面的 \(n-2\) 个位置扩展最长,设这个位置为 \(r'\).那么这时的答案为 \(\min(r', a_p)+b_p\)

    发现这时求 \(r'\) 又产生了一个新的问题.于是我们考虑按 \(a_i\) 从小到大将 \(2 \sim n\) 位置排序.于是可以顺着 DP,最终求出 \(p\) 的答案.

CF1848C Vika and Price Tags

一种顺推

不妨假设 \(a\) 远大于 \(b\).那么数列写出来会是

\[a,b,a-b,a-2b,b,a-3b,a-4b,b,\cdots \]

考虑将 \(a\) 表示成 \(\lambda b+r\).那么从 \(a\) 推到 \(r\) 的步数可以直接算出来.然后继续模拟这个辗转相除的过程即可.注意,下一步的时候若 \(r\) 不为 \(0\),需要将 \(r\) 放在除数的位置上才能保证时间复杂度.

一种逆推

设计 \(F_1=a, F_2=b, F_i= \left| F_{i-1}-F_{i-2} \right|\).将整个数列写出来直到第一个 \(K\) 满足 \(F_K=0\).首先有 \(F_{K-1}=\gcd(a,b)\).不妨考虑 \(F_{i}\) 在除去 \(\gcd(a,b)\) 后的奇偶性.在 \(\bmod\ 2\) 意义下可以写出式子:

\[F_{i} = F_{i+1}+F_{i+2} \]

已经确定最后两项的奇偶性为 \(1,0\).那么这个数列在 \(\bmod\ 2\) 意义下形如 \(\{\cdots 1,1,0,1,1,0\}\).这样刚好可以通过 \(F_1,F_2\) 也即 \(a,b\) 来判断 \(K \mod 3\) 的结果.

CF1848D Vika and Bonuses

首先,最优的行为一定为先将 \(s\) 加若干次再在剩余时间里兑换折扣.

不断加 \(s\) 的过程中,\(s\) 的末尾数码显然存在一个长度不超过 \(4\) 的循环节.可以将末尾数码相同的位置单独看.

设循环节长度为 \(len\).当前位置为 \(p\).那么下一个末尾数码相同的位置就是 \(p+len\).不妨我们比较加到 \(p\) 和加到 \(p+len\) 那个更优.

\[\begin{aligned} v_p &= (s+\sum_{j \le p} \Delta_j) (k-len \times p)\\ v_{p+len} &= (s+\sum_{j \le p+len} \Delta_j)(k-len(p+1)) \end{aligned} \]

设一个周期的总增长为 \(\Delta\)

\[v_{p+len}-v_p=\Delta(k-len(p+1)) - (s+\sum_{j \le p} \Delta_j) \]

随着 \(p\) 增长,\(\Delta\) 不变,\(k-len(p+1)\) 变小,\(s+\sum_{j \le p} \Delta_j\) 变大.可以发现 \(v_{p+len}-v_p\) 单调.于是我们可以通过二分找到峰值点的位置.

CF1835D Doctor's Brown Hypothesis

  • \(u\) 可达 \(v\)\(v\) 可达 \(u\):两个点必须在同一个强连通分量里.
  • \(k \ge n^3\).在一个强连通分量里增广任意个环.

不妨考虑如何判定在同一个 \(scc\) 中的两点 \(u,v\) 是否合法.设 \(scc\) 中所有环长的 \(\gcd\)\(d_r\).那么绕环只能且仅能增广出 \(d_r\) 的倍数.考虑任选 \(scc\) 中的某一个点为根使用 \(dfs\) 求出 \(scc\) 的一棵外向生成树,定义点 \(u\) 的深度 \(dep_u\) 为根节点到其的距离.我们需要找到 \(\bmod\ d_r\) 意义下 \(u \rightarrow v\) 的路径长度 \(len_{u \rightarrow v}\).这时我们不需要额外确定 \(v \rightarrow u\) 的路径长度,因为显然 \(len_{u \rightarrow v} + len_{v \rightarrow u} \equiv d_r(\bmod\ d_r)\).有 \(len_{u \rightarrow v} \equiv dep_v-dep_u\).可以这么想:我们把 \(u \rightarrow v\) 的路线规划成 \(u \rightarrow rt,\ rt \rightarrow v\)

考虑如何求出 \(d_r\).存在结论:当存在非树边 \(e:u \rightarrow v\),有 \(d|(|dep_v-dep_u-1|)\).可以使用上面的方法理解它:\(dep_v-dep_u-1\) 相当于将分别包含 \(rt,v\)\(rt, u\) 的两个环拼在了一起,形成一个包含 \(rt,u,v\) 的大环.

再来看之前的式子:

\[\begin{aligned} k &\equiv dep_v-dep_u \equiv dep_u-dep_v (\bmod\ d_r)\\ \rightarrow dep_v &\equiv dep_u\ or\ dep_v-dep_u \equiv d_r/2 \end{aligned} \]

在每个 \(scc\) 中分别讨论然后统计一下即可.

CF1856E2 PermuTree (hard version)

子树中的分配不会影响当前点的答案.考虑最大化每个点作为 \(lca\) 的答案.有结论:对于任意一个点 \(u\),存在一种给子树分配权值的最优方案使得同一棵子树中的权值全部都大于或都小于 \(u\) 的权值.证明可以考虑对于任意一个不满足的分配情况,挑选一棵同时存在大于和小于 \(u\) 权值的节点的子树,将其中的节点权值全部调整成大于 \(u\) 或小于 \(u\) 权值一定更优.

现在问题变成了:对于点 \(u\),求出一个子树集合的子集 \(S\) 使得最大化 \((\sum_{v \in S} siz_v)(siz_u-1-\sum_{v \in S} siz_v)\).显然这要求我们将子树集合划分成大小尽量平均的两部分.

\(u\) 的重儿子为 \(son_u\).当 \(2siz_{son_u} \ge siz_u-1\),显然将所有轻儿子放在一边最优.那么剩下的情况我们用子树凑出来.

直接进行一次背包的复杂度为 \(O(siz_u^2)\) 的,注意到不同的 \(siz_v\) 至多只有 \(\sqrt{siz_u}\) 种,我们使用多重背包的二进制分组优化技巧和 bitset 就可以把单次背包的时间复杂度降到 \(O(siz_u \sqrt{siz_u} \log {siz_u}/w)\)

使用主定理分析复杂度:

\[\begin{aligned} & T(n)=2T(n/2)+f(n),f(n)=n\sqrt{n}\log n/w\\ & T(n)=f(n)=n\sqrt{n}\log n/w \end{aligned} \]

如何支持一个变长的 bitset?手写一个.

CF1870E Another MEX Problem

\(F_{i, j}=0/1\) 表示考虑前 \(i\) 个位置是否可以选出若干段 \(mex\) 的异或值为 \(j\)

有转移:

\[\begin{aligned} & F_{i-1, j} \rightarrow F_{i, j} \\ & F_{k-1, j} \rightarrow F_{i, j \oplus mex_{[k, i]}} \end{aligned} \]

其中 \(mex_{[k, i]}\) 表示位于区间 \([k, i]\) 中的元素的 \(mex\)

显然枚举区间的转移是 \(O(n^3)\) 的.但并不需要枚举所有的区间.比如对于 \([l, r]\) 若存在 \([l_1, r_1]\) 满足 \(l_1 \ge l, r_1 \le r,mex_{[l_1, r_1]}=mex_{[l, r]}\),那么使用 \([l, r]\) 进行转移显然不如使用 \([l_1, r_1]\) 进行转移更优.

去掉所有可以被替代的区间.可以证明剩下的区间个数为 \(O(n)\) 个.

CF1871F Lazy Numbers

在 trie 上考虑.

每层的节点编号是连续的.我们可以发现:顺序考虑一层中的所有节点,其编号增加 \(1\),字典序至少增加 \(1\)——字典序的增速不小于编号的增速.

我们可以使用二分求出每一层中编号等于字典序的最小编号节点和最大编号节点.其所构成区间中的节点都是合法的.

如何求出一个节点在 trie 树上的字典序?考虑跳其祖先链并统计链上每个点小于自己的兄弟子树.

总时间复杂度为 \(O(T\log^3n)\)

CF1826D Running Miles

题目要求最大化 \(a_x+a_y+a_z+(z-x)\ (x \le y \le z)\)

不妨对于每个 \(y\) 维护 \(mx_y=\max_{x<y}(a_x+x+a_y)\).枚举 \(z\),当前 \(z\) 的最优答案即 \(\max_{y<z}mx_y+a_z-z\)

CF1826E Walk the Runway

\(500\) 维偏序!

转移连边显然是 DAG.一种做法是枚举点对 \((i, j)\) 然后暴力判断从 \(i\) 位置是否可以转移到 \(j\) 位置.但是这样做的复杂度为 \(O(n^2m)\)

可以一维一维地考虑:记 \(01\) 序列 \(f_{i, j}\) 表示考虑第 \(i\) 维,可以转移到 \(j\) 的位置.具体地,\(f_{i, j}[k]=[c_{i, k} < c_{i, j}]\).那么同时考虑所有维,满足 \(x\) 可以转移到 \(y\) 的条件是 \(\forall i,f_{i,y}[x]=1\).故我们可以将 \(f_{i,j}(i \in [1, m])\) 与起来,就可以得知哪些地方可以转移到 \(j\).总时间复杂度为 \(O(n^2m/w)\)

CF1525E Assimilation IV

答案为每个点被照亮的概率和.

考虑研究点 \(i\) 没有被照亮的概率:这要求每一个城市的光均不能到达它.假设城市 \(j\) 被点亮的时间为 \(t_j\).城市 \(j\) 不能点亮点 \(i\) 应满足 \(n-t_j+1 < d_{j, i}\),即 \(t_j > n-d_{j, i}+1\).所有城市的 \(t_j\) 应满足是一个排列.那么 \(i\) 不被照亮的概率就是每个 \(t_j\) 都不能点亮 \(i\) 的排列的个数除以排列总数.如何求出合法的排列数量?考虑按 \(t_j\) 降序排序,第一个 \(j\) 的选择方案数为 \(n-t_j+1\),第二个选择方案数为 \(n-t_j+1-1\)\(\cdots\) 把它们的选择方案数乘在一起就行.

时间复杂度为 \(O(nm)\)

driver 9.29

A. 商店

考察当商店集合确定时遍历商店的顺序.

\(t\) 时间后去往商店 \(i\),然后去往商店 \(j\).代价为

\[\begin{aligned} &((t+1)(a_i+1)+b_i+1)(a_j+1)+b_j\\ =&(t+1)(a_i+1)(a_j+1)+(b_i+1)(a_j+1)+b_j\\ =&(t+1)(a_i+1)(a_j+1)+b_ia_j+b_i+b_j+a_j+1 \end{aligned} \]

发现交换 \(i, j\) 更劣的条件是

\[b_ia_j+a_j < b_ja_i+a_i \]

故我们先按照这个排序,然后可以直接 DP.设 \(f_{i, j}\) 表示前 \(i\) 个商店中选择 \(j\) 个消耗的最小时间.

\(a_i \neq 0\) 是每次转移 \(f_{i, j}\) 至少翻倍,故 \(j \le \log T\).而 \(a_i=0\) 的商店一定会被排在最后用,故对于 \(a_i \neq 0\) 的部分 DP,对于 \(a_i = 0\) 的部分贪心取 \(b\) 最小的.

B. 下午茶

  1. \(x,2x,2^2x,2^3x,\cdots\)\(\bmod\) \(p\) 意义下形成一个环.
  2. \((2^k+1) \perp p\).假设有 \(2^kx \equiv -x\),则 \((2^k+1)x \equiv 0\).然后有 \(x \perp p, (2^k+1) \perp p\).矛盾.故不存在 \(x\)\(-x\) 在同一个环上.

那么只能 \(x\)\(-x\) 相消.考虑环上糖果传递.

C. 逆向惯性思维

\[\begin{aligned} ans&=\sum_{S} (x_{max}-x_{min})(y_{max}-y_{min})\quad (x,y \in S)\\ &=\sum_{S} x_{max}y_{max}-x_{min}y_{max}-x_{max}y_{min}+x_{min}y_{min}\quad (x,y \in S) \end{aligned} \]

不失一般地讨论 \(x_{max}y_{max}\).按 \(x\) 从小到大排序插入,每次统计 \(x_{max}=x_i\) 且取 \(x_i\) 的个数.维护每一种 \(y\) 前面的系数即可.具体来说,按 \(y\) 从小到大,每次系数会乘以 \(2\).可以使用平衡树:每次插入一个 \(y\) 时将后面的系数统一乘 \(2\)

D. 模糊的字符串

前缀表示解决比较.可持久化线段树优化哈希.

driver 9.30

A. Counting

容斥 + \(GF\)

假设没有格子的限制,可以任意走,该如何求 \(n\) 步走回原点的方案数?

设计生成函数 \(F\) 满足 \([x^i]F\) 等于 \(i\) 步走回原点的方案数.可以发现 \(F=(x^2+x+1)^{n}\)

\(H=x^2+x+1, F=H^n\).两边求导得到

\[\begin{aligned} F'&=(H^n)'\\ F'&=nH^{n-1}H'\\ HF'&=nFH' \end{aligned} \]

\(F_i=[x^i]F\),考虑

\[\begin{aligned} (x^2+x+1)F'&=(2x+1)nF \\ (i+1)F_{i+1}+iF_i+(i-1)F_{i-1}&=nF_i+2nF_{i-1}\\ (i+1)F_{i+1}&=(n-i)F_i+(2n-i+1)F_{i-1} \end{aligned} \]

然后我们得到了 \(F_i\) 的递推式.

如何刻画限制?考虑容斥.我们有两条线 \(a,b\),现在需要求出一条线都不撞的方案数.使用交替的方式刻画一种非法的方案:假如一种方案先撞几下 \(a\),然后再撞几下 \(b\),然后又撞几下 \(a\),之后是否撞击不管 \(\cdots\) 那么这个方案的撞线序列属于 \(aba\)

有最后的答案为

\[U-a'-b'+ab'+ba'-aba'-bab'+abab'+baba'\cdots \]

在式子中用方案类型的名称代表方案的数量.之所以加上飘号,是因为这个式子中计算 \(aba\) 不仅记录了 \(aba\),同样记录了 \(b\) 开头,但后面包含了 \(aba\) 交替段的方案.

考察对于任意一种完整的撞击方案,其被减掉的次数是怎么算对的:

撞击方案 a b a b
\(a\) 开头 \(-\) \(+\) \(-\) \(+\)
\(b\) 开头 \(-\) \(+\) \(-\)

可以发现上下两行相消之后只剩下 \(-1\)

所以这个容斥是对的 \(\cdots\)

B. Graph

DFS 构建无向图 DFS 搜索树.

现在手上有三个点集:\(path, S_1, S_2\).初始时所有点都在 \(S_1\)

DFS 进入 \(u\),将 \(u\)\(S_1\) 移入 \(path\)
\(u\) 退栈时,将 \(u\)\(path\) 移入 \(S_2\)

可以发现在这个过程中,除了 \(S_1,S_2\) 相等之外,\(path,S_1,S_2\) 始终满足题目中给出的所有条件.而初始时 \(S_1=n\),终止时 \(S_2=n\),且过程中每次操作 \(S_1,S_2\) 的差仅缩小 \(1\).故一定存在一组解.在 DFS 途中判断什么时候取到 \(S_1=S_2\) 即可.

C. 演唱会

首先圆方树.一条路径中必经点的数量就是圆方树中圆点的数量.

\(F_{i, j}\) 表示 \(i\) 节点子树深度为 \(j\) 的链的条数.

转移有 \(F_{v, i} \rightarrow F_{u, i+[u \le n]}\).统计答案显然.

考虑长剖优化.每个点继承其长儿子的答案,然后暴力将其他的儿子合并进入 DP 数组.考虑每条长链仅会被合并一次,故复杂度为 \(O(n)\)

长剖开数组的技巧.

建立一个内存池.然后为每一段长链分配一段等于其长度的空间作为其中节点 \(DP\) 数组的空间.缺点:下标需要从 \(0\) 开始.

posted @ 2023-09-05 01:33  ckain  阅读(108)  评论(1)    收藏  举报