Solution Set 2

\(\text{「CF1037H」Security}\)

有关字典序可以依次考虑 \(T\) 的每一位转化为询问 \(\mathcal O(|\Sigma||T|)\) 个字符串在区间 \([l,r]\) 的存在性判断。因为可以用线段树合并维护 \(\text{SAM}\) 上每个等价类的 \(\text{endpos}\) 集合,所以将存在性判断离线放在 \(\text{SAM}\) 的每个节点上在通过一次线段树合并依次回答即可,复杂度为 \(\mathcal O(|S|\log |S|+|\Sigma||T|\log|S|)\).

\(\text{「CF1017G」The Tree}\)

直接暴力,发现修改涉及到规模为 \(\mathcal O(n)\),而查询却只有 \(\mathcal O(1)\),所以考虑将修改复杂度摊到查询上。发现一条链上 \(1\) 操作的顺序并不影响最终染黑的节点,所以定义 \(w_u\)\(u\) 向下扩展的层数,如果 \(w_u=-1\) 表示不扩展,初始时 \(w\) 全为 \(-1\)。这样 一段链的和表示从链头扩展到链尾的层数,如果 \(\sum w_u\ge0\) 则表示链尾被染黑。所以修改只需单点加,而查询只需查询 \((\text{root},u)\) 的最大后缀和是否大于等于 \(0\) 即可。而 \(2\) 我们只需将子树全清空为 \(-1\),再将 \(w_u\) 赋为到根链最大后缀和值减 \(1\),复杂度为 \(\mathcal O(n\log^2 n)\).

\(\text{「AGC018C」Coins}\)

先钦定所有人对选择金币,我们令 \(u_i=b_i-a_i,v_i=c_i-a_i\),若是 \(v_i+u_j<u_i+v_j\)\(j\) 选择银币时 \(i\) 必定选择银币,所以我们可以按 \(u_i-v_i\) 排序,则序列分为两段,前一段选择铜币,后一段选择银币,直接优先队列维护即可,复杂度为 \(\mathcal O(n\log n)\).

\(\text{「AGC093F」Dark Horse}\)

发现 \(1\) 无论在哪个位置方案数都是一样的,不妨将其放在 \(1\) 号位统计答案在乘上 \((2^n)!\),答案符合即是 \([2,2],[3,4],[5,8],...,[2^{n-2}+1,2^n]\)\(n\) 个区间最小

\(\text{「雅礼集训 2018 Day10」} 贪玩蓝月\)

考虑如果物品槽是一个栈,可以用 \(\mathcal O(mp)\)\(\text{dp}\) 做,删除时直接回到上个状态即可,考虑如何扩展到双端队列。

有个经典 \(\text{trick}\) 就是双栈维护双端插入删除元素。该 \(\text{trick}\) 可以双端插入删除,维护半群运算,做到均摊 \(\mathcal O(n)\) 次运算。

用两个栈分别维护前后端的插入删除。

如果一个栈空了,考虑将另一个栈的元素按中点划分开,分别装入两个栈。

复杂度考虑势能函数 \(\Phi(t)=|\text{size}_1-\text{size}_2|\),即两个栈的大小之差。每次 \(\Phi(t)\) 最多增加 \(1\),重构时 \(\Phi(t)\leftarrow 0\),所以复杂度是均摊 \(\mathcal O(1)\)

用这个 \(\text{trick}\) 即可做到 \(\mathcal O(mp)\).

\(\text{「QOJ8526」Polygon II}\)

考虑无法构成多边形的充要条件,即最长边 \(\ge\) 剩余边长度和。设边 \(i\) 长度的随机变量为 \(x_i\),我们枚举最长边 \(p\)

\[x_p\ge \sum_{i\not =p}x_i\Rightarrow 2^{a_p}\ge \sum_{i\not =p}x_i+(2^{a_p}-x_p) \]

由于 \(x_p\)\((0,2^{a_p})\) 内均匀分布所以 \(2^{a_p}-x_p\) 与其分布相同,计算概率时可以等价为 \(x_p\).

所以题目转换为对于 \(n\) 个随机变量 \(x_i\) 求其和 \(s=\sum x_i\le 2^{a_p}\) 的概率。对于每个随机变量 \(x_i=a_i+b_i\) 其中 \(a_i\in[0,2^{a_i}-1]\) 为整数部分,\(b_i\in[0,1)\) 为小数部分,我们可以对整数部分和小数部分分开处理。

对于小数部分我们需要考虑 \(n\) 个均匀取值在 \([0,1)\) 随机变量和取值在 \([0,s]\) 的概率,对于这个问题,我们可以将每个变量取值范围扩充至 \([0,\infty)\) 考虑容斥掉 \([1,+\infty)\) 情况,钦定 \(k\) 个变量可以在 \([1,+\infty)\),转化一下等价于取值范围为 \([0,\infty)\) 的随机变量的和,可以考虑在 \([0,s]\) 中随机撒点,相邻两个点之间的差为对应随机变量的值,所以为 \(\dfrac{s^n}{n!}\) ,除以 \(n!\) 是用于钦定升序。

对于整数部分在 \([0,2^{a_i}-1]\) 随机等价于在 \(0\sim a_i-1\) 位每位有 \(\dfrac 12\) 概率为 \(1\),我们可以做一个数位 \(\text{dp}\)\(f(i,j)\) 为已经确定 \(0\sim i-1\) 位,之前位对于 \(i\) 的进位为 \(j\),转移可以枚举当前位有 \(k\) 个变量为 \(1\),所以有转移

\[\dfrac{\binom{c_i}{k}f(i,j)}{2^{c_i}}\rightarrow f(i+1,\lfloor\dfrac{j+k}{2}\rfloor) \]

小数部分贡献可以整合到 \(\text{dp}\) 的初始化中,计算答案时只需要钦定高于 \(a_p\) 的位全为 \(0\) 再乘上 \(f(a_p,0)\) 即可。

\(\text{「ARC105F」Lights Out on Connected Graph}\)

由于计数限制比较机械,考虑集合幂级数,对于连通二分图的 \(\text{GF}\) 可以先对图考虑二色图的集合幂级数,记 \(F\) 为连通二色图的集合幂级数,\(G\) 为任意二色图的集合幂级数,\(H\) 为连通二分图的集合幂级数,那么有两个方程 \(\exp F=G,F=2H\),可以解得 \(H=\dfrac 12\ln G\).

由此我们只需要求出 \(G\) 即可解得 \(H\),对于 \(G\) 为二色图可以先枚举点集 \(U\) 钦定一部分为黑色,补集为白色即可得到

\[G(S)=\sum_{U\cap V=\emptyset,U\cup V=S}2^{c(S)-c(U)-c(V)} \]

其中 \(c(S)\) 表示端点都在 \(S\) 中的边的数量,可以用子集卷积处理,复杂度为 \(\mathcal O(2^nn^2)\).

\(\text{「AGC062B」Split and Insert}\)

正着做不好记录状态里面。考虑时间倒流。每次相当于取出一个子序列放到后面。最终将将数组排成升序。

记录 \(f(i,l,r)\) 表示已进行完第 \(i\sim k\) 次操作,已经把数组中值为 \(l\sim r\) 的数排好序,转移如下

  • \(f(i,l,r)\leftarrow f(i+1,l,r)\) 本次不操作;
  • \(f(i,l,r)\leftarrow \min\limits_{l\le j<r}\{f(i+1,l,j)+f(i+1,j+1,r)+(r-j)c_i\}\) 本次将值在 \([j+1,r]\) 取出放到后面;

做一个 \(\mathcal O(n^4)\)\(\text{DP}\) 即可。

\(\text{「AGC008F」Black Radius}\)

对于每个 \(S(u,d)\) 表示与 \(u\) 距离不超过 \(d\) 的节点集合,我们先考虑 \(S(u,d)\) 不为全集的情况。先考虑特殊性质即全为关键点,对于每个连通块我们在其 \(d\) 最小的情况下统计就能保证不重复统计,我们称其为 \(S(u,d)\)\(u\) 处为最小表示,由于不考虑全集,容易证明最小的 \(d\) 唯一。对于节点 \(u\) 其合法的 \(d\) 满足两个限制

  • \(d\le f_u-1\) 其中 \(f_u\) 表示以 \(u\) 为根子树的最大深度,表示 \(S(u,d)\) 不为全集;
  • \(d\le g_u+1\) 其中 \(g_u\) 表示以 \(u\) 为根子树的次大深度,考虑如果 \(d\) 不为对应连通块\(d\) 最小的情况则 \(\exists v,S(u,d)=S(v,d-1)\) 如果这样的话就满足把 \(v\) 这棵子树删去之后,存在一个点使得它与 \(d(u,v)\ge d-2\) 容易考虑反面容易有 \(d\le g_u+1\)

这样就可以完成特殊性质。然后考虑有一些点是非关键点。如果我们不统计它们,但是它们会影响关键点导致上界过于严苛从而少算。所以我们对非关键点进行计数的 \(d\) 限制来使得统计到关键点被限制的部分。要使

  • 非关键点 \(u\) 对应关键点被限制的部分等价于 \(S(u,d)\) 对应连通块在 \(u\) 处为最小表示,这限制了 \(d\) 应该满足原有的限制;
  • 然后存在关键点 \(v,d'\) 满足 \(S(u,d)=S(v,d')\) 这要求 \(d\) 大于等于 \(v\) 所在子树的最大深度,于是这限制了 \(d\) 的下限,所以 \(d\ge h_u\),其中 \(h_u\) 为根为关键点子树最大深度的最小值。

\(f,g,h\) 可以 \(\mathcal O(n)\) 换根求出。

\(\text{「AGC049D」Convex Sequence}\)

考虑形成凸序列的过程,我们先选定 \(p\) 为凸序列的第一个最小值点,然后可以做任意次下列操作

  • 选定 \(i<p\),将 \(a_i,a_{i-1},a_{i-2},\cdots\) 加上 \(1,2,3,\cdots\)
  • 选定 \(i>p\),将 \(a_i,a_{i+1},a_{i+2},\cdots\) 加上 \(1,2,3,\cdots\)

最后我们要使得和为 \(m-\dfrac{p(p-1)}2\)(要保证 \(p\) 之前的最少一次操作),注意到最多有 \(\mathcal O(\sqrt m)\) 个物品(\(1,3,6,\cdots\)),可以用完全背包 \(\mathcal O(m\sqrt m)\) 求出固定 \(p\) 的答案,发现背包容易删除物品,直接顺着枚举 \(p\) 增删物品即可。

\(\text{「APIO2016」烟火表演}\)

容易想到一个状态为 \(\mathcal O(nV)\)\(\text{DP}\)\(f_u(x)\) 表示让子树 \(u\) 点燃时间为 \(x\) 的最小代价,容易得出转移式为

\[f_u(x)=\sum_{v\in\text{son}(u)}\min_{y\in[0,+\infty)}\{f_v(y)+|x-w-y|\} \]

对于这种式子我们可以考虑 \(\text{Slope Trick}\),对于 \(f_u\) 可以,记录 \(F_u(x)=\min\limits_{y\in[0,+\infty)}\{f_v(y)+|x-w-y|\}\) 考虑如何从 \(f_u\) 得到 \(F_u\),具体的可以分为 \(4\) 个区间:

  • \(x\in[0,L)\)

\(\text{「CF643F」Bears and Juice}\)

这题从信息的角度来考虑,什么是信息?考虑对于一个长度为 \(n\) 排列 \(p\) 进行基于比较的排序,通过比较获取信息最终区分出 \(n!\) 种排名中的一种。我们在比较 \(a\)\(b\) 时当前可能的排名排列中有一半满足 \(a<b\) 另一半满足 \(a>b\),我们通过一次比较可以将 前可能的排名排列排除一半所以基于比较的排序复杂的下界为 \(\mathcal O(\log n!)=\mathcal O(n\log n)\).

在这题我们可以根据熊睡觉的状态来区分出酒所在的位置,考虑 \(R_k\),最后的信息可以描述为长度为 \(n\) 且值域为 \([0,k]\) 的整数序列,且非零数数量 \(\le \min(p,n-1)\)

所以显然可以构造出 \(R_k\) 的上界为

\[\sum_{i=0}^{\min(p,n-1)}\binom {n}{i}k^i \]

考虑证明 \(R_k\) 就等于这个上界,我们对于每个酒桶分配一个计划表 \(t_{i,j}\) 表示第 \(i\) 头熊是否在第 \(j\) 天饮用该酒桶。考虑任意两个酒桶 \(a,b\) 计划表都不能相同,不然就不能通过 \(a,b\) 的计划表的信息区分出 \(a,b\) 是否是酒。

\[\sum_{i=1}^{y-1}(p_i-\dfrac{c_{i+1}-c_i}{2})^2 \]

其中变量 \(p\) 满足 \(1=p_0\le p_1\le\cdots\le p_{y-1}\le p_y=x\),由于 \(\dfrac{c_{i+1}-c_i}{2}^2\) 为常数,转换为保序回归的 \(\text{L}_2\) 问题,范围限制可以将 \(p_i\) 直接向 \([1,x]\) 取整即可,解决该问题可以维护一个单调栈,因此对于向\([1,x]\) 取整的操作可以在单调栈上二分,取整后一段区间的贡献是可以 \(O(1)\) 计算的,所以复杂度为 \(\mathcal O(n\log n)\).

\(\text{「???」色}\)

首先可以观察到答案一定在某一条边产生,进一步可以观察到答案一定在最小生成树上,问题转换为动态维护树上异色相邻点对距离。我们可以对每个结点,将它的儿子按到父亲的边权从小到大排序。考虑异色的限制,线段树维护当前区间的共同颜色(如果没有设为 \(0\) 即可)。查询时,尽量向左儿子走(如果可以走,即与共同颜色不同)。修改时考虑更新自己和父亲的贡献,查询全局最大值即可。

\(\text{「CF1253F」Cheap Robot}\)

由于询问点都是充电站,而且 \(u\) 可以到 \(v\) 则一定有 \(v\) 可以到 \(u\),是一个等价关系,考虑维护充电站之间的等价关系

考虑从一个点 \(u\) 出发的最优策略,可以发现应该是去最近的充电站(如果可以去),设其距离为 \(f(u)\),则其当前电量满足 \(x\ge f(u)\).

下面将证明 \(c-f(u)\ge x\),实现考虑当前路径的上一个充电站为 \(p\) 则有 \(x=c-\text{dis}(p,u)\) 由于 \(f(u)\) 的定义一定有 \(f(u)\le \text{dis(p,u)}\) 所以 \(c-f(u)\le c-\text{dis}(p,u)=x\).

考虑 \(u\) 的下一个点为 \(v\),那么有 \(c-f(v)\ge x-w\ge f(v)\),合并所有两个式子有 \(c\ge f(u)+f(v)+w\),则其实也是 \(u\)\(v\) 合并的充要条件,所以按 \(f(u)+f(v)+w\) 从小到大枚举,每次启发式合并 \(u\)\(v\) 即可做到 \(\mathcal O(n\log n)\) 的复杂度。

\(\text{「CF843D」Dynamic Shortest Path}\)

首先容易有一个 \(\mathcal O(qn\log n)\) 的做法,考虑优化掉 \(\log\).

由于每次只对 \(\mathcal O(c)\) 条边加 \(1\),所以每次最短路增量一定在 \([0,c]\) 范围内。设修改前最短路为 \(f(u)\) 考虑每次增量 \(\delta(u)\) 的转移式

\[\delta(u)=\min_{(v,u,w)\in E}(\delta(v)+w+f(u)-f(v)) \]

我们将 \(w+f(u)-f(v)\) 看为边权一定大于等于 \(0\),否则有 \(f(v)>f(u)+w\) 不满足最短路限制。对于最短路值域在 \([0,V]\) 的单源最短路可以将距离存在桶中,可以去掉 \(\log\),复杂度为 \(\mathcal O(qn)\).

\(\text{「ARC076D」Exhausted?}\)

将每个人向可以坐的椅子连边构成,容易发现答案为 \(n\) 减去按该二分图的最大匹配。

考虑 \(\text{Hall}\) 定理的扩展形式,设 \(G=(V,E)\) 则有 \(G\) 的最大二分图匹配 \(p(G)=|V|-\max\limits_{S\sub V}\{|S|-|N(S)|\}\),其中 \(N(S)\) 表示 \(S\) 的邻接点集合。

由于 \(N(S)\) 本质上是点集的并,考虑转换为不能连边的区间的交。所以目标转换为找一个集合 \(S\),最大化

\[|S|-(m-|\bigcap_{i\in S}(l_i,r_i)|)=|S|+|\bigcap_{i\in S}(l_i,r_i)|-m \]

  • \(S=\emptyset\),为 \(n-m\)
  • \(S\not=\emptyset\),之后对于当前的一个区间 \((l_i,r_i)\),考虑用扫描线维护 \(\min_{i\in S}r_i-max_{i\in S}l_i\) 可以 \(\mathcal O(n\log n)\) 计算;

\(\text{「AMPPZ2013」Bytehattan}\)

可以发现题目最特殊的性质是平面图,考虑转对偶图,发现每次断边就是相当于连通边两端的平面。

发现 \(u,v\) 不连通相当于对偶图形成环,所以用并查集维护对偶图的连通性,如果每次连通时已经连通则原图 \(u,v\) 不连通。

\(\text{「湖北省选模拟 2023」棋圣 / alphago}\)

先考虑树的做法,操作作不改变棋子任意两个棋子之间的距离的奇偶性将整棵树黑白染色后,只有所在位置颜色不同,且棋子本身颜色不同的棋子对可能产生贡献。设 \(c(i,j)\) 表示位置颜色是 \(i\) 棋子颜色为 \(j\) 的棋子数量,容易得到上界为 \((c(0,0)c(1,1)+c(0,1)c(1,0))\max w_i\),考虑能否构造出上界。

发现能构造出上界的充要条件是存在一个度数大于等于 \(3\) 的点。如果存在,则选择它的不同 \(3\) 棵子树中的叶子 \(x,y,z\),可以通过反复选择 \(x,y,z\) 使得取到上界,如果没有度数大于等于 \(3\) 的点,图为一条链,一次操作相当于将某对相邻棋子之间的距离减少 \(2\),或者将所有棋子在链上平移。考虑设计 \(\text{dp}\) 计算贡献,设 \(f(i,l,r)\) 表示将 \(l\sim r\) 的棋子聚集到 \(i\) 是最大贡献,转移考虑枚举下个有棋子的位置和下一个棋子区间 \([r+1,r']\),直接枚举是 \(\mathcal O(n^5)\),是不可接受的,但是 \(j-i\le \text{dist}(r,r+1)\),所以状态数从 \(\mathcal O(n^3)\) 变为 \(\mathcal O(n^2)\),复杂度为 \(O(n^4)\).

对于非二分图情况可以通过奇环改变任意棋子对的奇偶性,任选一棵生成树,将处于黑点的白棋通过奇环移动至白点,将处于白点的黑棋通过奇环移动至黑点,所有黑白棋子对产生最大边权的贡献,设 \(c(i)\) 表示棋子颜色为 \(i\) 的棋子数量,答案为 \(c(0)c(1)\max w_i\).

\(\text{「CSP-S 2021」交通规划}\)

将超级源点向白点连边,黑点向超级汇点连边,那么答案即为最小割,对于 \(k=2\) 的情况原题为平面图,直接对偶图跑 \(\text{Dijkstra}\) 可以做到 \(\mathcal O(Tnm\log (nm))\) 复杂度,对于 \(k>2\),由于不一定为平面图,不能延用之前的做法。

考虑将射线相邻的同色点缩在一起,我们就需要将每队异色段断开即可,对于异色段 \(i,j\),断开花费为 \(w(i,j)\),由反证可以证明最优的方案删除路径不相交(相交就将相交部分分开不影响断开),所以考虑一个 \(\text{dp}\) 即可,先复制两遍断环为链设 \(f(l,r)\) 为将 \([l,r]\) 断开花费,有转移 \(f(l,r)=\min\{f(l+1,r-1)+w(l,r),\min_k f(l,k)+f(k+1,r)\}\),总复杂度为 \(\mathcal O(\sum k nm\log nm+\sum k^3)\).

\(\text{「ZJOI2022」树}\)

\(f(S),g(S)\) 分别表示 \(S\) 中点恰为 \(T_1,T_2\) 的非叶子结点的方案数,答案为

\[\sum_{S\cap T=\emptyset,S\cup T=\{1,\cdots,n\}}f(S)g(T) \]

考虑将恰好容斥为至少,设 \(F(S),G(S)\) 分别至少表示 \(S\) 中点为 \(T_1,T_2\) 的非叶子结点的方案数,答案为

\[\sum_{S\cap T=\emptyset,S\cup T=\{1,\cdots,n\}}\sum_{U\subset S,V\subset T}F(U)G(V)(-1)^{|S|+|T|-|U|-|V|} \]

化简一下为

\[\sum_{S\cap T=\emptyset}F(S)G(T)(-2)^{n-|S|-|T|} \]

现在这个式子可以直接 \(\text{DP}\) 处理,定义 \(f(i,j,k)\) 表示考虑 \(1\sim i\) 的点,其中 \(j\) 个属于 \(S\)\(k\) 个属于 \(T\) 的贡献系数和,转移考虑第 \(i+1\) 个点属于 \(S/T\) 或是都不属于,具体而言是:

  • \(i+1\in S,i+1\not\in T\) 时,\(f(i,j,k)\times jk\rightarrow f(i+1,j+1,k)\)
  • \(i+1\not\in S,i+1\in T\) 时,\(f(i,j,k)\times jk\rightarrow f(i+1,j,k-1)\)
  • \(i+1\not\in S,i+1\not\in T\) 时,\(-2f(i,j,k)\times jk\rightarrow f(i+1,j,k)\)

总复杂度为 \(\mathcal O(n^3)\).

posted @ 2024-09-06 22:16  little_pinkpig  阅读(79)  评论(0)    收藏  举报