记录

P4340 [SHOI2016] 随机序列

\(s_i\) 为前 \(i\) 个的和。发现 \(+,-\) 抵消。有:\(s_i=3s_{i-1}+g_{i-1}(a_i-1)\)。其中 \(g_i\) 为连续 $\times $ 的值的和。且 \(g_i=g_{i-1}\times a_i\)

待修用矩阵维护转移,上线段树即可。时间复杂度 \(O(n\log n)\)

CF1149C Tree Generator™

发现这个括号序与欧拉序类似。

对于树上一条路径,可以看作是括号序的一个区间,去掉合法括号匹配。那么将 \()\) 看出 \(1\)\((\) 看出 \(-1\) 后,就相当于将区间变成两部分,前面一部分的和减去后面一部分的和的最大值了。因为 \(u \to lca\) 都是 \()\)\(lca \to v\) 都是 \((\),且 \((,)\) 抵消。

线段树维护即可。时间复杂度 \(O(n\log n)\)

P4425 [HNOI/AHOI2018] 转盘

我的 typora 没了。不想写了。为什么电脑死机啊。

大概就是说。我们可以倒着走,因为经过一个点多次,如果某次满足 \(\ge T_i\),那么最后一次一定也满足。简单化简相当于求 \(\min\limits_{i=n+1}^{2n}(\max\limits_{j=i-n+1}^{i}(T_j-j)+i)\)。同时增加 \(n-1\)。且有 \(T_i -i > T_{i+n}-(i+n)\)。那么就是后缀 \(\max\) 了。单侧递归线段树维护即可。时间复杂度 \(O(n\log^2 n)\)

AT_arc136_e [ARC136E] Non-coprime DAG

这么困难。

考虑 \(a,b\) 什么时候可以同时选。

  1. \(\gcd(a,b)=1\)

  2. \(x\)\(a\) 的最小质因子,\(y\)\(b\) 的最小质因子。那么 \(\lfloor\frac{b}{xy}\rfloor-\lfloor\frac{a}{xy}\rfloor =0\)

注意到偶数最多选一个,且 \(1\) 一定能选。那么尝试对 \(a,b\) 的奇偶性分类讨论:

  1. \(a\) 是偶数,\(b\) 是偶数。不行。
  2. \(a\) 是偶数,\(b\) 是奇数。当 \(b-y \ge a\) 时,因为 \((b-y)\bmod 2=0\),所以不行。否则由于 \(x=2\)\((2y)|(b-y)\),所以一定可以。
  3. \(a\) 是奇数,\(b\) 是偶数。同情况 \(2\)。在 \(a+x \le b\) 时不行,否则可以。
  4. \(a\) 是奇数,\(b\) 是奇数。如果 \(a+x \le b-y\),则不行。因为 \((a+x)\bmod 2=0,(b-y)\bmod 2=0\)。否则可以,因为 \((b-y,y]\) 中不存在 \(xy\) 的倍数,\([a,a+x)\) 中也不存在 \(xy\) 的倍数。

那么有决策:

  1. \(1\) 可以选。
  2. 选出来的奇数一定满足:\(\bigcap\limits_{i=1}^{m} [x_i-g(x_i)+1,x_i+g(x_i)-1] \ne \emptyset\)
  3. 如果选择偶数,则选出来的偶数 \(y\) 一定满足:$y \in \bigcap\limits_{i=1}^{m} [x_i-g(x_i)+1,x_i+g(x_i)-1] $。

枚举交集中的一个数 \(y\)。那么所有区间包含 \(y\) 的奇数都可以选,\(y\) 在其是偶数是也可以选,\(1\) 可以选。则需要维护区间加,全局 \(\max\)。差分做到 \(O(n)\)。如果带单点修改,线段树做到 \(O(n\log n)\)

CF1210F2 Marek and Matching (hard version)

困难。

根据 Hall 定理,若 \(S\) 存在完美匹配,则一定有与 \(S\) 中某个点相连的右部节点构成的集合 \(T\) 满足 \(|S| \le |T|\)

考虑定义状态函数 \(f_{s,t}\) 表示 \(s\) 为左部节点,\(t\) 为右部节点,且存在完美匹配的方案数。发现这个转移会算重。举个例子,合并两个集合 \(S1+S2=S,T1+T2=T\),在交换后仍然满足条件,所以算重了。

如何。考虑定唯一的代表元。这里找 \(|S|-|T|\) 最大的,有多个找 \(|S|\) 最小的做代表元。证明唯一性。

那么可以考虑记 \(F(s,t)\)\(t\)\(s\) 中某个点相连的右部节点构成的集合的方案数,\(G(s,t)\)\(t\)\(s\) 不存在任意一条边的方案数。那么有:

\(f_{s,t}=F(s,t)-\sum\limits_{s' \subset s}^{t' \subset t} f_{(s-s'),(t-t')}\times g_{s',t'} \times G(s',(t-t'))\)。这里 \(g_{s,t}\) 表示 \(s,t\) 不存在完美匹配的方案数。因为我们确定了唯一的代表元,所以在 \(s,t\) 不存在完美匹配时只会在将图分成存在和不存在完美匹配两部分时被计算一次,且 \(g_{s,t}\) 一定是代表元。

\(g_{s,t}=F(s,t)-\sum\limits_{s' \subset s}^{}\sum\limits_{t' \subset t}^{} f_{(s-s'),(t-t')}\times g_{s',t'} \times G(s',(t-t')) [|s'|-|t'|\ge |s|-|t|]\)。要求不算重。

时间复杂度 \(O(3^{2n})\)

CF1401E Divide Square

平面图。答案等于:内部交点(不算与大正方形交的点)+ 贯穿边数(端点都与大正方形交)+1。

后面两个好求。对于第一个情况,考虑扫描线。

\(x\) 轴。维护 \(y\) 轴哪些点被一条横线覆盖。那么枚举 \(x=x0\) 的竖线,求区间和就行了。是个单点覆盖,区间查询问题。线段树做到 \(O(n\log n)\)

CF283E Cow Tennis Tournament

给定竞赛图。其中 \(s_u > s_v\)\(u \to v\)\(k\) 次操作,每次将所有 \(s_u \in [l,r]\land s_v\in[l,r]\) 的边反转,求最后三元环的数量。

发现这个值域是假的。相当于是给定序列 \(1\dots n\),初始时 \(i \to j [i <j]\)。每次将 \([l,r]\) 内所有边翻转,求最后 \(i\) 的出度。

对于一个 \(i\),考虑 \(i \to j\) 时,操作区间应该满足什么条件。

  1. \(i<j\)\(l \le i , j \le r\) 的区间数量为偶数。
  2. \(i>j\)\(l \le j,i \le r\) 的区间数量为奇数。

分开求解。对于第一个,按 \(l\) 从小到大排序。然后是前缀异或,维护后缀 \(0\) 的数量。对于第二个,按 \(r\) 从大到小排序。然后是后缀异或,维护前缀 \(1\) 的数量。

线段树维护做到 \(O(n\log n)\)

CF407E k-d-sequence

求最长的区间 \([l,r]\)。使得可以给 \(\{A_l,\dots,A_r\}\) 插入不超过 \(k\) 个数,让它成为一个公差为 \(d\) 的序列。如果有多个,输出 \(l\) 最小的。

对于一个已经排序的序列 \(A\),有:\(A_i=x+(i-1)d\)。那么首先可以得到 \(A_i \equiv A_{i-1} \pmod d\)。则序列划分成了若干个段,使得任意一组答案不会与两个段相交。

这个时候首项 \(A_1 \bmod d\) 是多少不重要了。给所有 \(A_i\) 除以 \(d\)。问题变成:求最长的区间 \([l,r]\),使得 \(\max\limits_{i=l}^{r}A_i -\min\limits_{i=l}^{r}A_i+1 -(r-l+1) \le k\),且不存在 \(A_i=A_j\)。析合树可做,但是不会。

考虑扫描线,扫 \(r\)。那么需要对每个 \(l\) 维护:\(\max\limits_{i=l}^{r}A_i-\min\limits_{i=l}^{r}A_i+l\)。需要找到最小的 \(l\),满足前面的式子 \(\le k+r\)。两个单调栈可维护 \(\max,\min\)。同时维护 \(lmin\) 表示对于当前 \(r\),最小的 \(l\),使得 \([l,r]\) 中不存在 \(A_i=A_j\)。那么就是一个区间加,区间维护 \(\min\),区间求 \(x \le k\) 的最大下标的问题。线段树做到 \(O(n\log n)\)

GYM102979C Colorful square

正方形就很唐。

显然有单调性,小的可以大的一定行。那么二分,记现在的边长为 \(len\)

扫描线,扫 \(x\) 轴。对于每种颜色,维护其 \(y\) 坐标集合。那么 \(x \to x+1\) 时,每次最多删掉一列的点。对于这一列上的点 \((x',y,c)\)。维护第一个比 \(y\) 大的颜色相同的位置,第一个比 \(y\) 小的颜色相同的位置。那么所有 \(lst < y0 \le y \le y0+len < nxt\) 的矩形都会少一种颜色。加一列的点同理。时间复杂度 \(O(n\log^2 V)\)

HDU5770 Treasure

找到一条路径 \(P(u,v)\)。定义该路径的价值为从 \(u\) 走到 \(v\),每到一个点会得到该点上所有钥匙,然后看当前节点上的宝箱对应的钥匙是否得到了,如果是就得到该宝箱的价值后求和。求最大价值的路径。

考虑点分治。显然一个宝箱最多在 \(O(\log n)\) 次点分治中被使用。对于 \(x \to u\) 的路径(\(u\) 是分治重心),所有满足 \(dis_{x,U_i}+dis_{U_i,V_i}+dis_{V_i+u}=dis_{x,u}\)\(W_i\) 一定会产生贡献。则只需要考虑 \(U_i,V_i\) 属于不同链的情况。哦,这里题目的 \(U,V\) 和我是反的,我的 \(U\) 是题目里的 \(V\)

不想做。

Arithmetic

CF407E 改。

仍然划分成连续段。

扫描线,扫 \(r\)。线段树维护每个 \(l\)\(\max A_i -\min A_i -(r-l)\)。区间子区间问题,需要维护历史和。

\(r-1 \to r\) 时:整体 \(val_l \to val_l-1\)。对于 \(\max\)\(\min\) 变化的,也是区间加的形式。加完后维护当前和累加到历史和的 tag。

用矩阵描述:

\[\begin{equation} \left[ \begin{array}{ccc} sum & hsum & len \end{array} \right] \end{equation} \]

区间加 \(x\),有:

\[\left[ \begin{array}{ccc} sum' & hsum' & len \end{array} \right] \times \left[ \begin{array}{ccc} 1 & 0& 0 \\ 0 & 1&0\\ x & 0&1 \end{array} \right] = \left[ \begin{array}{ccc} sum & hsum &1 \end{array} \right] \]

更新历史和,有:

\[\left[ \begin{array}{ccc} sum' & hsum' &len \end{array} \right] \times \left[ \begin{array}{ccc} 1 & 1& 0 \\ 0 & 1&0\\ 0 & 0&1 \end{array} \right] = \left[ \begin{array}{ccc} sum & hsum &len \end{array} \right] \]

直接做的时间复杂度 \(O(a^3n\log n),a=3\)。给 \(1.5s\) 纯搞笑。

P3214 [HNOI2011] 卡农

记“小集合”为题目中的片段,“大集合”为题目中片段构成的集合。

如果在意大集合内小集合的顺序,那么答案显然会更方便,且一个大集合只会被算 \((|S|)!\) 次。有 \(|S|=m\)

思考可能的小集合构成排列(在意顺序)是怎么得到的。很明显,应该是不断加一个之前没出现过的小集合,且停止时所有数的出现次数为偶数。

因为直接计算答案看起来不太现实,考虑将问题划分成子问题求解。尝试维护 \(f_{i}\) 表示 \(m=i\) 的答案(在意顺序)。发现对于 \(m=i\),如果我们已知其中 \(i-1\) 个集合是什么,那么剩下那个集合也能够确定。但这样算会将剩下集合为空集,剩下集合已经被选两种情况都算到。

考虑去掉这两种情况。对于空集,相当于 \(i-1\) 个集合已经满足所有数出现奇数次,则方案数为 \(f_{i-1}\)。对于已经被选过的情况,一定是 \(i-1\) 个集合再选它们中的一个,此时被多选的集合去掉后所有数出现次数仍为偶数,那么方案数为 \(f_{i-2}\times (i-1)\times (2^n-1 -(i-2))\)

则:\(f_i=A_{2^n-1}^{i-1}-f_{i-1}-f_{i-2}\times (i-1)\times (2^n-1 -(i-2))\)。时间复杂度 \(O(n)\)

HDU6643 Ridiculous Netizens

直接上背包是不是就是对的。

不知道啊,暴力合并有用的直接在 vjudge 上面跑到最优解了。93ms,甚至比第二个快了一倍。

CF1659E AND-MEX Walk

显然 \(1,2,3\) 不可能同时出现,那么对答案分类讨论:

  1. 答案是 \(0\)。要求 \(w_1 \& w_2 \dots \& w_m >0\)。显然需要满足二进制下某一位在 \(w_1,w_2\dots w_m\) 中都出现过。拆位并查集,时间复杂度 \(O((n+q)\log V)\)
  2. 答案是 \(1\)。显然不用管 \(0\) 是否出现过,因为没出现过一定在情况 \(1\) 被算到,只需要在意是否存在一条不包含 \(1\) 的路径。要让答案是 \(1\),就要在第一个 $w_1 & w_2 \dots & w_k $ 第 \(1\) 位不是 \(1\) 的时候存在某一位是 \(1\)。因为是与,所以如果在之前所有除了第 \(1\) 位都变成了 \(0\),那么一定在 \(1 \to 0\) 后依然为 \(0\),反之一定不为 \(1\)。贪心地,只要能走到一个 \(z\),满足到 \(z\) 之前按位与都比 \(1\) 大,且到 \(z\) 后就变成 \(0\) 就行了。之后无论怎么走都是 \(0\)。那么就是是 \(u\) 能通过第 \(x\) 位为 \(1\) 的边(\(x>1\))走到某个存在出边的第 \(1\) 位为 \(0\) 的点的点。并查集维护即可。
  3. 答案是 \(2\)。同理。
  4. 答案是 \(3\)。显然不可能。

显然只需要判断 \(0,1\)。时间复杂度 \(O((n+q)\log V)\)

CF516D Drazil and Morning Exercise

可能今天有点烫吧。

首先 \(f_x\) 可以 \(O(n)\) 求,然后发现询问数量很少,猜测每次可以暴力做。

需要维护最大值和最小值,那么考虑枚举最小值 \(\min f_x =f_u\)。那么所有 \(f_u \le f_{v} \le f_{u}+d\) 的点都可以选。按照 \(f_x\) 排序后这显然是个区间。

如果将区间 \([f_u,f_u+d]\) 的点全标记为 \(1\),其它为 \(0\)。就是求一个 \(1\) 的极大联通块大小。

考虑维护变化量。当 \(f_u\) 减小时,\(f_{u}+d\) 不增,那么一个点也只会被标记成 \(1\) 一段时间,且一旦从 \(1\) 变成 \(0\) 就没用了。那么可以直接对当前时刻从 \(0\) 变成 \(1\) 的点暴力维护并查集,一个联通块内的点表示之前都变成 \(1\) 过,或者单独一个点。那么对于 \([f_u,f_u+d]\)\(1\) 的情况,将 \((f_u+d,10^{100})\) 中的点变成 \(0\) 就行了。具体地,直接将它所在联通块大小减 \(1\),因为后面不可能在与这个点产生关系了。

那么答案就是任意时刻,任意联通块大小的最大值。在每次某个联通块大小变化的时候维护即可。时间复杂度 \(O(nq)\)

P7310 [COCI 2018/2019 #2] Deblo

拆位啊。

考虑第 \(i\) 位的贡献。那么就是路径数量,使得路径中有奇数个 \(1\)

\(dis(u,v)=dis(u,1)\oplus dis(v,1)\oplus val_{lca}\)。因为只在意奇偶性。

枚举 \(lca\)。如果 \(val_{lca}\) 是奇数,就是在两个不同子树选两个 \(0\) 的方案数,否则是 \(1\)。时间复杂度 \(O(n\log V)\)

P5025 [SNOI2017] 炸弹

\(i\) 和所有满足 \(|x_j -x_i|\le r_i\)\(j\) 连边。那么就是 \(i\) 能到的点的数量。因为 \(x\) 递增,所以 \(i\) 连的是个区间。那么线段树优化建图做到边数 \(O(n\log n)\)

考虑求答案。显然强联通分量内点可以到达。发现 \(i\) 能到的点也一定是区间,那么维护能到的最小点和最大点就行了。时间复杂度 \(O(n\log n)\)

P3588 [POI 2015 R2] 沙漠 Desert

每个 \(k_i\)\(r_i-l_i+1-k_i\) 个点连边。然后跑拓扑排序。

发现区间数量是 \(\sum k\) 级别的,那么线段树优化建图做到 \(O(\sum k \log n)\)

AT_agc035_d [AGC035D] Add and Remove

每次选择 \(i(1 \le i \le n-2)\)。将 \(a_{i}\)\(a_{i+2}\) 增加 \(a_{i+1}\),然后删掉 \(a_{i+1}\)。求最后 \(a_1+a_2\) 的最小值。

考虑删掉 \(i\) 对答案的贡献。相当于初始时全是 \(0\),只有 \(i\)\(1\)。执行上面的操作,求最后 \(a_1+a_2\) 的值。

首先 \(a_{i-1},a_{i+1}\) 会变成 \(1\)。序列长成:\(000\dots 0110\dots 0\)。删掉一个 \(0\) 没影响,删掉 \(1\) 会变成 \(000\dots 0120\dots 0\)。然后变成 \(13\) 或者 \(32\)。再变可能是 \(14,43,35,52\)

那么从后往前做。维护后面用了多少个 \(a_i\)。因为我们只在意区间左右端点的值(可以看做左边一直删,右边一直删,只剩下左右端点),记左端点值为 \(x\),右端点为 \(y\)。那么这个时候 \(i\) 会贡献 \(a_i \times (x+y)\)。此时对于 \([l,i-1]\)\(y’\) 会变成 \(x+y\)。因为删掉 \(i\)\([l,i-1]\) 中的点也会贡献到 \(i\) 上面。对于 \([i+1,r]\)\(x'\) 会变成 \(x+y\)

维护 \(f_{l,r,x,y}\),有:\(f_{l,r,x,y}=\min\limits_{i=l}^{r}f_{l,i-1,x,x+y}+f_{i+1,r,x+y,y}+a_i\times (x+y)\)

因为 \(x,y\) 是随之前状态变化的,所以有时间复杂度 \(T(n)=\sum\limits_{i=0}^{n-1}T(i)+T(n-i-1),T(0)=1\)。则 \(T(n)=O(3^n)\)

CF930E Coins Exhibition

首先给两种区间分别去掉包含。

那么第一种区间 \(l,r\) 单增,第二种区间 \(l,r\) 单增。

定义状态函数 \(f_{i,0/1,j}\) 表示前 \(i\) 个硬币,第 \(i\) 个硬币是反面或正面,且最近的与第 \(i\) 个硬币不同的硬币位置在 \(j\) 的方案数。分类讨论:

对于所有情况,首先:

\[f_{i,0,j}=f_{i-1,0,j} [j<i-1]\\ f_{i,0,i-1}=\sum f_{i-1,1,j}\\ f_{i,1,j}=f_{i-1,j,1}[j<i-1]\\ f_{i,1,i-1}=\sum f_{i-1,0,j} \]

  1. 不存在第一种区间 \(r=i\),且不存在第二种区间 \(r=i\)。没有特殊条件。
  2. 存在第一种区间 \(r=i\),且不存在第二种区间 \(r=i\)\(f_{i,0,j}=0[j<l]\)
  3. 不存在第一种区间 \(r=i\),且存在第二种区间 \(r=i\)\(f_{i,1,j}=0[j<l]\)
  4. 存在第一种区间 \(r=i\),且存在第二种区间 \(r=i\)\(f_{i,0,j}=0[j<l_1],f_{i,1,j}=0[j<l_2]\)

最后答案就是 \(\sum f_{i,0/1,j}\)。线段树优化做到 \(O(k\log n)\)。考虑优化掉不必要的点。

注意到我们只在意端点。考虑将 \([1,k]\) 按照端点划分成 \(O(n+m)\) 个区间。定义状态函数 \(f_{i,0/1,j}\) 表示前 \(i\) 个区间,第 \(i\) 个区间右端点为反面或正面,且上一个与第 \(i\) 个区间右端点不同的位置在第 \(j\) 个区间的方案数。

对于所有情况,有:

\[f_{i,0,j}=f_{i-1,0,j}[j\le i-1]\\ f_{i,0,i}=\sum (f_{i-1,0,j}+f_{i-1,1,j})\times (2^{len_i-1}-1)[j\le i-1]\\ f_{i,0,i-1}=f_{i-1,1,j}[j\le i-1]\\ f_{i,1,j}=f_{i-1,1,j}[j\le i-1]\\ f_{i,1,i}=\sum (f_{i-1,0,j}+f_{i-1,1,j})\times (2^{len_i-1}-1)[j\le i-1]\\ f_{i,1,i-1}=f_{i-1,0,j}[j\le i-1]\\ \]

如果存在第一种区间 \(r=i\)\(f_{i,0,j}=0[j<l]\)

如果存在第二种区间 \(r=i\)\(f_{i,1,j}=0[j<l]\)

这里的 \(r,l\) 表示区间右端点。两个双指针,维护全局 \(sum\) 做到 \(O(n)\)。哦,排序带 \(\log\)

Gym102798K Tree Tweaking

\(\sum\limits_{i=1}^{n}dep_i=\sum\limits_{i=1}^{n}siz_i\)。也就是说,我们只需要让 \([l,r]\) 中的点重排后挂上去的 \(\sum siz_i\) 最小就行了。因为 \([1,l-1]\)\(\sum siz_i\) 一定,\([r+1,n]\)\(\sum siz_i\) 也一定。而 \([l,r]\) 会被 \([1,l-1]\) 中的点拆成若干个区间。那么只需维护 \(f_{l,r}\) 表示 \([l,r]\) 构成 BST 后的最小 \(siz\) 和即可。时间复杂度 \(O(len^3)\)

AT_agc028_e [AGC028E] High Elements

观察 \(p_i\) 在什么情况下会是前缀 \(\max\)

显然,需要满足 \([1,i-1]\) 中所有比 \(p_i\) 大的都和 \(p_i\) 不在一起。

暴力地,定义状态函数 \(f_{i,x,y,k}\) 表示前 \(i\) 个数,第一个 \(\max=x\),第二个 \(\max=y\),且差量为 \(k\) 是否可行。那么:

\[f_{i,x,y,k}=f_{i-1,x,y,k}[x\ge p_i \lor y\ge p_i]\\ f_{i,p_i,y,k+1}=f_{i-1,x,y,k}[p_i>x]\\ f_{i,x,p_i,k-1}=f_{i-1,x,y,k}[p_i>y] \]

最后如果 \(f_{n,*,*,0}=1\) 就说明有解。时间复杂度 \(O(n^4)\)

注意到有一边一定是前缀 \(\max\)。那么:

  1. \(mx_i=mx_{i-1}\)

    \[f_{i,mx_i,y,k}=f_{i-1,mx_i,y,k}\\ f_{i,y,mx_i,k}=f_{i-1,y,mx_i,k}\\ f_{i,mx_i,p_i,k-1}=f_{i-1,mx_i,y,k}[y<p_i]\\ f_{i,p_i,mx_i,k+1}=f_{i-1,y,mx_i,k}[y<p_i] \]

  2. \(mx_i=p_i\)

    \[f_{i,mx_i,y,k+1}=f_{i-1,mx_{i-1},y,k}\\ f_{i,mx_i,mx_{i-1},k+1}=f_{i-1,y,mx_{i-1},k}\\ f_{i,y,mx_i,k-1}=f_{i-1,y,mx_{i-1},k}\\ f_{i,mx_{i-1},mx_i,k-1}=f_{i-1,mx_{i-1},y,k} \]

时间复杂度 \(O(n^3)\)。好像难以优化了。

换个思路,因为是字典序最小问题,所以一般可以按位求答案。那么现在问题变成:已知 \(X\) 中的一些数和 \(Y\) 中的一些数,要将 \([i+1,n]\) 分成两个子序列,第一个接在 \(X\) 后面,第二个接在 \(Y\) 后面。问是否存在一种划分方式让 \(X\)\(Y\) 的价值相等。

因为现在变成构造,且不需要知道具体方案。尝试构造极端情况。根据之前的分析,得到任意时刻 \(X\)\(Y\) 中都有一个的 \(\max\) 是前缀 \(\max\)。维护每个前缀 \(\max\) 分别属于 \(X\) 还是 \(Y\)。发现可以通过构造,使得 \(X\)\(Y\) 的前缀最大值正好是原序列中的前缀最大值。因为考虑如果 \(X\) 中有一个不是前缀最大值的数,\(Y\) 中也有,由于它们都不是原序列的前缀最大值,根据开头的条件,显然比它们大的数都在另一边。那么交换后就都不是 \(X\)\(Y\) 的前缀最大值了。那么这样必定能使 \(X\)\(Y\) 的前缀最大值正好是原序列中的前缀最大值。

\(cnt_i\)\([i,n]\) 中前缀最大值的数量。维护之前 \(X\) 的价值,最大值和之前 \(Y\) 的价值,最大值。那么:

\[val_X + (cnt_{i+1}-k)=val_Y+k+\delta \]

化简得到:

\[val_X-val_Y+cnt_{i+1}=2k+\delta \]

其中 \(k+\delta\) 是选择了一个上升子序列,满足该子序列开头大于 \(mx_Y\),且恰好有 \(k\) 个是前缀最大值,\(\delta\) 个不是前缀最大值。将前缀最大值的点的权值看成 \(2\),其它的看成 \(1\)。就是选择一个权值和为 \(val_X-val_Y+cnt_{i+1}\) 的上升子序列,满足开头大于 \(mx_Y\)。第二种情况同理,权值和为 \(val_Y-val_X+cnt_{i+1}\),开头大于 \(mx_X\)

如果选出来的上升子序列为 \(121211\dots 121\)。那么删掉一个 \(2\) 后奇偶性不变。所以只需要维护后缀开头大于 \(x\),且权值和为奇数或偶数时的最大权值和。

定义状态函数 \(f_{i,0/1}\) 表示以 \(p_i\) 为开头,且权值和是偶数或奇数时的最大权值和。那么:

  1. \(val_i=1\)\(f_{i,0}=\max\{f_{j,1}|j>i \land p_j >p_i\}+1,f_{i,1}=\max\{f_{j,0}|j>i \land p_j >p_i\}+1\)
  2. \(val_i=2\)\(f_{i,0}=\max\{f_{j,0}|j>i \land p_j >p_i\}+2,f_{i,1}=\max\{f_{j,1}|j>i \land p_j >p_i\}+2\)

树状数组维护做到 \(O(n\log n)\)

P14520 【MX-S11-T1】战争游戏

如果 \(a_{m}>a_{m+1}\)\(a_{m}+a_{m+1}> a_{m+2}\),显然小 L 可以先吃。然后小 K一定会退,此时小 L 也退不劣。那么只需要维护前缀和就行了。时间复杂度 \(O(n)\)

P14521 【MX-S11-T2】加减乘除

维护能够到达 \(i\) 时的区间 \([l,r]\)。那么这就是个区间平移,区间求交的操作。DFS 一遍时间复杂度 \(O(n)\)

然后差分一下就行了。时间复杂度 \(O(n+m)\)。哦,离散化要。

P14522 【MX-S11-T3】空之碎物

如果是一个 \(0,1\) 序列,\(f(1,n)\) 怎么求。

相当于有 \(x\)\(0\)\(y\)\(1\)。每次选两个数出来做运算,求最后剩的可不可能是 \(1\)

  1. \(y\) 是奇数。一定能通过将 \(y-1\)\(1\) 变成 \(\frac{y-1}{2}\)\(0\),然后不断通过第三条去掉 \(0\)
  2. \(y\) 是偶数。
    1. \(x=0\)
      1. \(y \ge 4\) 时先得到一个 \(0\),剩下 \(y-2\) 个数不断通过第二条去掉 \(1\),直到剩下一个再通过第三条去掉 \(0\)
      2. \(y=2\) 时只能得到 \(0\)
    2. \(x >0\)。直接去掉 \(y-1\)\(1\),再消掉 \(0\)

发现只有当 \(x=0,y=2\) 时不可能是 \(1\)

好像不能拓展。考虑从其它角度入手。注意到 \(f(l,r)\le \max\limits_{i=l}^{r}a_i\),尝试让 \(f(l,r)=\max\limits_{i=l}^{r}a_i\)。那么就是需要构造结合顺序,使得所有 \(1\) 的位在结束后仍然为 \(1\)。我要让 \(x\) 保留下来,就需要让剩下 \(r-l\) 个数在这些 \(1\) 的位上变成 \(0\)。发现不变成 \(0\) 的条件十分苛刻,考虑到最后一定是 \(((x ⊖ y_1)⊖ y_2)\dots ⊖ y_m)\),其中 \(y_i\) 又是多个数继续向前面这样操作得到的。发现除开 \(x\) 后,只要第 \(i\) 位有 \(\ge 2\)\(1\),就一定可以变成 \(0\)。而如果只有一个 \(1\),只需要让剩下 \(r-l-1\)\(0\) 中的一个再它前面就行了。那么这样最坏情况下每一位都需要有一个 \(0\),最多 \(\log V+1\) 个就可以让它们都变成 \(0\)。所以当 \(r-l+1 \ge \log V+2\) 时答案就可以达到上界。

此时 \(r-l+1\) 就是 \(O(\log V)\) 的了。因为 \(f(l,r)\) 一定是某个 \(a_i-x\),枚举 \(i\) 再从高位往低位跑,看是否可以是 \(1\)。这样每枚举一次需要 \(O(\log V)\) check。那么时间复杂度就是 \(O(n\log^3V)\) 的。

发现实际上只需要枚举 \(a_i\) 是最大值或次大值就行了,证明简单。时间复杂度 \(O(n\log^2 V)\)

P5492 [PKUWC2018] 随机算法

先看最大独立集怎么求。

枚举状态 \(s\)\(O(m)\) 判断可行性做到 \(O(2^nm)\)。通过上一个状态加点,\(O(n)\) 判断做到 \(O(2^nn)\)

那么我们只需要求最后 \(S\) 属于答案集合的排列 \(p\) 的数量。

更简单地,只需要关系最后 \(S\) 的大小是否等于最大独立集的大小。

如果 \(x\) 能加入 \(S\),说明所有和 \(x\) 有连边的点都没被加入 \(S\)。那么 \(\forall(u,v)\in E \land u=x ,tim_v >tim_u\)。那么逐一确定加入 \(S\) 中的点的值后,就会有若干个形如 \(tim_v > tim_u\) 的限制。显然,由于 \(S\) 是最大独立集,所以只用考虑这些限制可以满足时 \(p\) 的数量,而不在意会不会有新的点被加进来。

发现 \(p_1\) 一定是 \(S\) 中的点,因为它一定会加到 \(S\) 中。发现相邻两个 \(S\) 中的点之间的点一定会和之前的一个 \(S\) 中的点有连边,否则会加入 \(S\) 中。

定义状态函数 \(f_{j,s}\) 表示现在独立集为 \(s\),且有 \(j\) 个与 \(s\) 中点有连边的点还没确定位置的方案数。可以做到 \(O(n^22^n)\)。很没前途。

考虑到这题只需要求概率,而不在意方案数。那么只要确定了 \(S\) 中有哪些点,它们的顺序是什么,就可以直接计算答案了。因为对于一个不在 \(S\) 中的点 \(v\),只要找到第一个加入 \(S\) 中且与它相连的点 \(u\),让 \(tim_v >tim_u\) 就行了。这样不在 \(S\) 中的点就对概率不产生影响(但对方案数显然会产生影响)。

那么问题变成:每次选择一个未被标记的点,并把和它有连边且未被标记的点标记(包括自己),然后将这个点加入 \(S\) 中。求最后 \(S\) 的大小最大的概率。

定义状态函数 \(f_{s}\) 表示当前被标记的点的集合为 \(s\) 的概率。首先选择 \(x\) 的概率为 \(\frac{1}{n-|bel_s|}\)。那么:\(f_{s\cup x}=f_{s}\times \frac{1}{n-|bel_s|}\)。时间复杂度 \(O(n2^n)\)

AT_arc078_d [ARC078F] Mole and Abandoned Mine

求删边的最小代价,使得删完后 \(1\)\(n\) 不经过重复点的路径唯一。

\(1\)\(n\) 的路径应该是 \(P_1,P_2,\dots,P_k\),且 \(P_1=1,P_k=n\)。那么剩下 \(n-k\) 个点和一些边一定是通过连接 \(1\)\(n\) 得到。且不可能同时和 \(1,n\) 联通(删去 \(P_2\dots P_{k-1}\) 后)。维护 \(f_{s,x}\) 表示一条点集为 \(s\) 的链,开头为 \(1\),结尾为 \(x\) 的最小代价。有转移方程:\(f_{s\cup \{u\},u}=\min\{spd_u+f_{s,x}-w_{x,u}-\sum\limits_{v\in s}^{}w_{u,v}\}\)。特殊转移 \(u=1\),对于 \(u=1\),有:\(f_{\{1\},1}=spd_1\)

注意到其实这个链上面可以挂一些其它的链,就像树的直径那样。维护 \(dp_s\) 为在一条 \(1\sim n\) 的链上挂一些链,集合为 \(s\) 的最小代价。那么 \(dp_{s}=\min(f_{s,n},dp_{s/x}-\max\limits_{y\in (s/x)}^{}w_{x,y}+spd_x-\sum\limits_{v\in (s/x)}^{}w_{x,v})\)

然后考虑把剩下的点拼起来。维护 \(g_{s}\) 表示将 \(s\) 中的点分成两半,一半和 \(1\) 连,一半和 \(n\) 连的最小代价。那么:\(g_{s}=\min\limits_{\{1\} \subseteq t \subseteq s/\{n\}}^{}h(t/\{1\},s /t/\{n\})-\sum\limits_{u\in t\land v=n}^{}w_{u,v}-\sum\limits_{u\in (s/t)\land v=1}^{}w_{u,v}\)。其中 \(h(s,t)\) 为删掉所有 \(u\in s \land v\in t\) 的代价。

那么最后答案就是 \(\min dp_{s}+g_{t}+h(t/\{1,n\},U/s/t)[s\cap t =\{1,n\}]\)。那么时间复杂度就是 \(O(3^n+2^nn^2)\)

发现其实 \(dp_{s}\) 不能只维护挂链,因为挂的链内部也可以有连边(可以看做是挂了个联通块),如果单纯维护链会错 \(2\) 个点。维护简单,和 \(dp_s\) 的转移方程差不多。复杂度仍为 \(O(3^n+2^nn^2)\)

AT_agc059_c [AGC059C] Guessing Permutation for as Long as Possible

因为是完全图。所以一旦存在 \(tim_{a,b}>\max(tim_{a,c},tim_{c,b})\),且 \(\min(p_a,p_b) \le p_c \le \max(p_a,p_b)\) 就不可行。

因为拓展 \(3\) 个点的情况到 \(k\) 个点,\(p_{a},p_b\) 大小在加入 \((a,b)\) 之前确定,一定满足存在 \(a\)\(b\) 的路径或 \(b\)\(a\) 的路径。如果 \(a,b\) 所在联通块不是完全图,说明存在 \(a\)\(b\) 路径上或 \(b\)\(a\) 路径上两点 \((x,y)\) 的边没有连接,此时在 \((x,y)\) 判定不合法无影响;否则 \(a,b\) 所在联通块是完全图,那么一定存在 \((a,c),(c,b)\) 的边,此时判断 \(3\) 点的情况合理。

那么这样可以找到若干对形如 \(p_c < \min(p_a,p_b) \lor p_c > \max(p_a,p_b)\) 的限制。

对于一个竞赛图,其对应排列唯一。那么限制转为:若 \(tim_{a,b} >\max(tim_{a,c},tim_{b,c})\),则 \((a,c)\)\((b,c)\) 不同向。显然,一条边只会有两个方向。那么并查集维护做到 \(O(n^3)\)

AT_arc154_d [ARC154D] A + B > C ?

注意到 \(p_{i}+1 > p_j\) 等价于 \(p_i \ge p_j\)。而因为 \(p\) 是排列,所以 \(p_i+1 >p_j \to p_i>p_j\)

那么只需要维护 \(1\) 的位置,然后 sort 一遍。对于 \(p_i=1\)。一定有:\(p_i+p_i\le p_j\)。因为 \(1+1 =2\)。则从前往后扫一遍,维护当前可能是 \(1\) 的位置 \(x\)。若 \(p_x+p_x > p_i\),则 \(p_x >1\),此时将 \(i\) 替换成可能的 \(1\)。而之前所有 \(j\) 都有 \(p_x+p_x \le p_j\),所以那些 \(j\) 一定不可能是 \(1\)

这样次数就是 \((n-1)+n\log n\) 的。

直接 sort 可能会被卡,要用 stable_sort。

P10197 [USACO24FEB] Minimum Sum of Maximums P

\(n\) 个点,其中 \(k\) 个点被标记。可以交换任意对没被标记的点。求 \(\sum \max(a_i,a_{i+1})\) 的最小值。

首先 \(\max(x,y)=\frac{x+y+|x-y|}{2}\)。那么只需要让 \(\sum |a_i-a_{i+1}|\) 最小了。

对于 \(K=0\),显然从小到大排序。

对于 \(K\ne 0\)。考虑寻找性质。首先这 \(K\) 个点会将序列分成 \(K+1\) 个区间。拿某一个区间 \([l,r]\) 观察(\(l-1\)\(r+1\) 分别是 \(x_w,x_{w+1}\))。发现显然 \([l,r]\) 要么升序要么降序,否则不优。且在 \(a_{l-1}\le a_{r+1}\) 时升序,在 \(a_{l-1} > a_{r+1}\) 时降序。记 \(mi=\min\limits_{i=l}^{r}a_i,mx=\max\limits_{i=l}^{r}a_i,X=\min(a_{l-1},a_{r+1}),Y=\max(a_{l-1},a_{r+1})\)。那么这个区间的代价就是:\(mx-mi+|X-mi|+|Y-mx|\)

拍到值域上看,对于一个没被标记的点,记 \(c_i\) 为它所在区间编号。那么理应不存在 \(x\dots y \dots x \dots y\) 的情况。因为 \(x-mi+|X-mi|+|Y-mx|\)\(mi\) 增大或 \(mx\) 减小时不劣,那么此时当 \(x\)\(y\) 分别是两个区间右、左端点时交换不劣,且在不是端点时交换无影响。

那么此时 \(K+1\) 个区间 \([mi,mx]\) 形成的区间要么不交,要么是包含关系。这个时候就简单很多了。尝试 DP 维护。

定义状态函数 \(f_{l,r,s}\) 表示将值域区间 \([l,r]\) 拿出来,填满了 \(s\) 中为 \(1\) 的区间时的最小代价(这里的值域剔除了被标记的点)。有转移:

  1. 正常合并,\(xyx | zwz\)\(f_{l,r,s}=f_{l,k,x}+f_{k+1,r,y}[x\cup y=s]\)。转移时间复杂度 \(O(n3^{K+1})\)
  2. 构成一个区间,\(x\)\(f_{l,r,\{x\}}=v_r-v_l+|X_x-l|+|Y_x-r| [len_x =r-l+1]\)。转移时间复杂度 \(O(K)\)
  3. 留空,留给 \([l,r]\) 外部区间。例如当前区间包含了 \(yxz\),若外部区间有 \(x|yxz|x\) 时,就可以将 \(x\) 留空。且不可能存在 \(x|yxwz|w\),给 \(xw\) 留空的情况。因为这相当于两个区间合并,不计算无影响。同时,\(w|yxwz|x\) 不可能存在,相交了。那么 \(f_{l,r,s}=f_{l,k1,x}+f_{k2,r,y}[x\cup y=s \land k1<k2]\)
  4. 补空。将情况 \(3\)\(x\) 补进来。此时需要满足 \(r-l+1=\sum\limits_{x\in s}^{}len_x\),因为所有的空都被补满了。不可能存在 \(xyxzx[]wx\) 的情况,同情况 \(3\)\(f_{l,r,s}=f_{l',r',s/\{x\}}+v_r-v_l+|X_x-v_l|+|Y_x-v_r|[r-l+1=\sum\limits_{x\in s}^{}len_x\land l < l' \land r' < r]\)
  5. 在左边或右边添加新的区间。\(f_{l,r,s}=f_{l',r,s/\{x\}}+v_{l'-1}-v_l+|X_x-v_l|+|Y_x-v_{l'-1}| [l'-l=len_x]\)。右边同理。

这样的时间复杂度为 \(O(n^33^{K+1}+nK+n^32^{K+1})\)。尝试优化。

  1. 正常合并。此时可以钦定左边填满了,这种划分一定存在。若不存在,说明 \(l\) 是一个空位,那么不该在这种情况。\(f_{l,r,s}=f_{l,l+S_x-1,x}+f_{l+S_x,r,s/x}\)。其中 \(S_s=\sum\limits_{x\in s}^{}len_x\)。时间复杂度 \(O(3^{K+1})\)
  2. 构成一个区间。和补空没区别,省略。
  3. 构成一个区间。发现和补空无区别,省略。
  4. 留空。发现如果留的空不是 \(l\) 也不是 \(r\),那么相当与是合并了,不该在这种情况。则只会有 \(f_{l,r,s}=f_{l+1,r,s}\)\(f_{l,r,s}=f_{l,r-1,s}\)。时间复杂度 \(O(1)\)
  5. 补空。因为我们只在意 \(l,r\) 与区间长度。所以当 \(L,R\) 是第一个不是空位的位置时,$l <l'\le L,R \le r' <r $ 是没有区别的。也就是说,只需要 \(f_{l,r,s}=f_{l+1,r-1,s/\{x\}}+v_r-v_l+|X_x-v_l|+|Y_x-v_r|[r-l+1=\sum\limits_{x\in s}^{}len_x]\) 就行了,其它 \(l',r'\) 本质相同。时间复杂度 \(O(2^kk)\)
  6. 在左边或右边添加新的区间。和合并没区别,省略。

那么实际上就只有 \(3\) 个转移了,且时间复杂度降至 \(O(n^23^{K+1}+n^22^kk)\)

需要注意 \(len_{s}=0\) 的情况。

AT_arc131_d [ARC131D] AtArcher

首先每隔 \(D\) 的距离射一箭不劣。那么最终射箭的位置应该满足 \(x_i \equiv x_{i+1}\pmod D\)

发现 \(D\) 小得离谱,尝试枚举余数。对于区间 \((r_i,r_{i+1}]\),价值都是 \(s_i\)。特殊的,\(0\) 的价值是 \(s_0\)。那么第 \(i\) 个区间会对一个余数 \(x\) 贡献:\(\lfloor\frac{r_{i+1}-x}{D}\rfloor-\lfloor\frac{r_{i}-x}{D}\rfloor\)。显然我们应该取这里面前 \(n\) 大的数。

\[\lfloor\frac{r_{i+1}-x}{D}\rfloor\\ =\lfloor\frac{r_{i+1}}{D}\rfloor-\lfloor\frac{r_{i+1}\bmod D+x}{D}\rfloor \]

前者是定值,后者值域在 \([0,1]\)。对于第 \(\lfloor\frac{n}{2}\rfloor\) 只箭,一定是和 \(0\) 距离最近的箭。枚举它的位置,那么就是求区间 \([l,r]\)\(y\bmod D=x\) 时的价值和了。

显然 \(\max l -\min l=D\)。对这 \(D\) 个位置特殊处理,剩下的点就可以用上面式子差分给所有 \(x\) 了,差分部分 \(O(M+D)\)。而这 \(D\) 个特殊位置实际上只是多限制了 \(x\) 的值域,且该值域是个后缀。区间取交后差分。总时间复杂度 \(O(N+M+D)\)

AT_arc126_c [ARC126C] Maximize GCD

\(K\) 诈骗。当 \(K \ge \sum ((\max a_j)-a_i)\) 时,先将所有值变成 \(\max a_j\) 不劣。若剩下的 \(K>n\),继续全局加不劣。且最终答案一定是 \(\max a_i\)。因为此时 \(\gcd(a_i)=\max a_i\)。而 \(\gcd(b_1\dots b_m)\le \min b_i\)

那么现在 \(A_i\) 的增加量不超过 \(3\times 10^5\)。考虑枚举 \(\gcd\)。维护 \(f_{x}\) 为将所有数变成 \(x\) 倍数的最小代价。那么答案就是 \(\max\limits_{f_x \le K}^{} x\)。那么就是 \(f_x =\sum x-(A_i\bmod x)\)。有:\(x\bmod y=x-y\times \lfloor\frac{x}{y}\rfloor\)。枚举 \(y\)\(t=\lfloor\frac{x}{y}\rfloor\)。那么 \((yt,y(t+1))\) 中的数 \(x\) 会对 \(f_y\) 贡献 \(y-(x-y \times t)=y\times (t+1)-x\)。前缀和维护区间内数的数量与和即可。时间复杂度 \(O(V\log V)\)

AT_arc126_d [ARC126D] Pure Straight

困难。

考虑状压,定义状态函数 \(f_{i,s}\) 表示前 \(i\) 个数,现在后面 \(|s|\) 个是答案序列时的最小代价。分类讨论:

  1. \(i\) 不加入 \(s\)。此时可能是将 \(i\) 移到这 \(|s|\) 个数的左边,也可能是剩下 \(k-|s|\) 个数移到 \(i\) 左边(因为它们都在 \(i\) 后面)。尝试提前计算费用。那么有:\(f_{i,s}=f_{i-1,s}+\min(|s|,k-|s|)\)
  2. \(i\) 加入 \(s\)。条件为 \(a_i \not\in s\)\(f_{i,s\cup \{a_i\}}=f_{i-1,s}+\sum\limits_{x\in s}^{}[x>a_i]\)

答案为 \(\min f_{i,U}\)。时间复杂度 \(O(n2^k)\)

AT_agc043_d [AGC043D] Merge Triplets

对于排列中连续 \(4\) 个数 \(p_{l},p_{l+1},p_{l+2},p_{l+3}\)。若 \(p_l>p_{l+1}>p_{l+2}>p_{l+3}\),显然不合法。因为只能将 \(3\) 个数分在一组,而无论怎么分都会有一个比 \(p_l\) 小。又因为连续,所以一定是一个栈或多个栈的栈顶。那么一定对。

则现在我们按照前缀 \(\max\) 划分,就可以得到若干个长度不大于 \(3\) 的段。需要将一些 \(1\) 的段和 \(2\) 的段合并,凑成刚好 \(n\) 个长度为 \(3\) 的段。显然,不能两个长度为 \(2\) 的段合并。则当长度为 \(1\) 的段的数量不小于长度为 \(2\) 的段的数量时,将 \(2\) 消耗完后一定能构造合法;且不满足时一定会至少剩下两个长度为 \(2\) 的段,一定不能构造合法。

那么一个排列合法,当且仅当:按照前缀 \(\max\) 划分后,所有段的长度 \(\le 3\),且长度为 \(1\) 的段的数量不小于长度为 \(2\) 的段的数量。

尝试按照相对大小确定排列。因为只在意 \(1\) 的数量和 \(2\) 的数量的大小关系,尝试定义状态函数 \(f_{i,j}\) 表示确定了 \(p_1\dots p_i\) 的相对大小,且 \(1\) 的数量减 \(2\) 的数量为 \(j\) 的方案数。那么:

  1. 加一个长度为 \(1\) 的段。那么 \(i+1\) 的相对大小一定是 \(i+1\)\(f_{i+1,j+1}=f_{i,j}\)
  2. 加一个长度为 \(2\) 的段。在 \(i+1\) 是最大的情况下,\(i+2\) 的大小不能大于 \(i+1\) 的值。\(f_{i+2,j-1}=(j+1)\times f_{i,j}\)
  3. 加一个长度为 \(3\) 的段。同上,有 \(f_{i+3,j}=(j+2)\times (j-1)\times f_{i,j}\)

最后答案就是 \(\sum\limits_{j\ge 0}^{}f_{n,j}\)。时间复杂度 \(O(n^2)\)

AT_joi2014ho4 フクロモモンガ (Sugar Glider)

如果已知路径 \(P\)。那么额外的代价应该是:\(h_n+(\sum\limits_{i=k}^{m}t_i)-(x-\sum\limits_{i=1}^{k-1}t_i)\)。满足 \(\sum\limits_{i=1}^{k-1} t_i \le x\)\(\sum\limits_{i=1}^{k}t_i >x\)。也就是说,一直下降,直到再降就到地面下面了为止。然后每次往上爬到足够下降的高度。

上面式子拆开就是 \(h_n-x +\sum\limits_{i=1}^{m}t_i\)。维护 \(dis_{u,0}\) 表示到达 \(u\),且一直下降,下降距离为 \(dis_{u,0}\) 时的最小下降距离。\(dis_{u,1}\) 表示到达 \(u\),且当前在 \(0\) 的最小时刻。那么答案就是 \(\min(dis_{n,0}+|x-dis_{n,0} -h_n|,dis_{n,1}+h_n)\)。时间复杂度 \(O(m\log m)\)

CF1361E James and the Chase

如何判定一个点是否是有趣的。

考虑建出以 \(x\) 为根的 dfs 树。那么这棵 dfs 树上应该不存在前向边或者横叉边。因为如果存在 \(u \to v\) 的前向边,而又存在树上 \(u \to v\) 的路径,那么 \(x\)\(v\) 的路径就不止一条了,横叉边同理。这样的时间复杂度 \(O(n)\)。暴力判断所有点的时间复杂度 \(O(n^2)\)

那能否通过已知信息推出其它信息呢。如果已知 \(x\) 是有趣的,那么 \(x\) 子树 \(u\) 中如果存在 \(>1\) 条后向边,那么一定存在不止一条 \(u\to x\) 的路径。而又因为原图强联通,所以一定存在一条后向边。那么此时只需要让这条后向边 \(a \to b\) 到达的祖先 \(b\) 是有趣的就行了。因为对于 \(u\) 子树外的点,只能通过 \(a \to b\) 的边到达。而在 \(b\) 是有趣的时,\(u\) 子树外的点恰好只存在一条路径,且 \(b\)\(u\) 子树内的点的路径不合法(经过两次 \(u\) 了)。

那么只要找到一个有趣的点 \(x\),就可以通过建 dfs 树得到所有有趣的点了。时间复杂度 \(O(n)\)

如果原图中有趣的点的数量为 \(k\)。那么一个点是有趣的概率为 \(\frac{k}{n}\)。随机 \(x\) 个点都不是有趣的点的概率为 \((1-\frac{k}{n})^x\)。因为只需要对 \(\frac{k}{n}\ge \frac{1}{5}\) 的图求解,所以 \(1 -\frac{k}{n}\le \frac{4}{5}\)。此时随机 \(70\) 次就很小了。时间复杂度 \(O(xn)\)

CF2165C Binary Wine

\(\sum\limits_{i=1}^{n}\max(0,b_i-a_i)\) 的最小值。使得 \(\bigoplus\limits_{i=1}^{n}b_i =c\)

从高往低做。对于当前位:

  1. \(c_i=0\)
    1. 若存在 \(a_{j,i}=1\)。此时可以用 \(a_j\) 后面所有位。
    2. 若不存在 \(a_{j,i}=1\)。不管。
  2. \(c_i=1\)
    1. 若存在 \(a_{j,i}=1\),且数量大于 \(1\)。此时可以用第二个 \(a_{j,i}=1\)\(j\) 凑出后面所有位。
    2. 若存在 \(a_{j,i}=1\),且数量等于 \(1\)。将其减去 \(2^i\)
    3. 若不存在 \(a_{j,i}=1\)。将当前最大的变成 \(2^i\)

显然,只有 \(2.3\) 会产生代价。且一定满足高位全部清空成 \(0\) 了。所以不可能存在更优的解,使得可以用前面一个减去 \(2^{i’}\) 的凑成 \(2^i\),再用 \(j\) 凑成 \(2^{i'}\)

发现当 \(n > \log V\) 时,一定存在某位数量大于 \(1\)。而在第一次大于 \(1\) 的位置一定会停下,所以保留最大的 \(O(\log V)\) 个点做就行了。时间复杂度 \(O(q\log^2 V)\)

CF2172L Maximum Color Segment

区间异或可以差分。操作 \([l,l+k-1]\) 等价于操作 \(l-1,l+k-1\)。然后 \(i\) 的异或次数就是 \(\bigoplus\limits_{j\le i}^{} s_j\)

注意到操作一次 \([l,l+k-1]\),实际上会变化的只是 \((l-1,l)\)\((l+k-1,l+k)\)。维护初始时 \(b_i\) 表示 \(i\)\(i-1\) 是否同色。那么操作一次会将 \(b_{l}\oplus 1\)\(b_{l+k} \oplus 1\)。发现此时 \(l \equiv l+k \pmod k\)。那么问题又变成,有若干个等价类,每次操作可以选择一个等价类中相邻两项,将它们异或 \(1\)。求在不超过 \(m\) 次操作后,所有等价类中 \(b_x=1\) 的数量的最大值。

考虑定义状态函数 \(f_{x,i,j,0/1}\) 表示对于第 \(x\) 个等价类,前 \(i\) 个值操作了 \(j\) 次,且 \(b_{x+(i-1)k}=0/1\)\(1\) 数量的最大值。那么:

\[f_{x,i,j,b_{x+(i-1)k}}=f_{x,i-1,j,0/1}+b_{x+(i-1)k}\\ f_{x,i,j+1,b_{x+(i-1)k}\oplus 1}=f_{x,i-1,j,0}+(b_{x+(i-1)k}\oplus 1)+1\\ f_{x,i,j+1,b_{x+(i-1)k}\oplus 1}=f_{x,i-1,j,1}+(b_{x+(i-1)k}\oplus 1)-1\\ \]

然后就是 \(k\) 个等价类合并,背包即可。这样时间复杂度 \(O(k (\frac{n}{k})^2+km\frac{n}{k})\)

P13534 [OOI 2023] The way home / 回家的路

维护 \(dis_{u,x}\) 表示从 \(1\)\(u\),且表演 \(x\) 次后最多剩下的钱的数量。则:

  1. 坐飞机。\(dis_{v,x}=dis_{u,x}-s_{u,v}\)
  2. 表演。\(dis_{u,x+1}=dis_{u,x}+w_u\)

用但是发现第二维有点大。我们的决策肯定是,如果钱够,就走;不然一直加之前走过的 \(w\) 的最大值,直到够走。发现第一次走到最大值的位置 \(x\) 后,一定是走最短路到某个点 \(u\)

问题是,无法同时维护当前余额和表演次数。但是发现维护当前最优情况下表演次数的最小值 \(a\),相同表演次数维护余额最大值 \(b\) 不劣。分类讨论:

  1. 若存在 \(a'=a,b'< b\) 更优。显然不可能。
  2. 若存在 $a' >a $ 更优。经过 \(s\) 边的代价为:\(\frac{s-b'}{w}+a',\frac{s-b}{w}+a\)。那么 \(\frac{s-b'}{w}+a' < \frac{s-b}{w}+a\)。则 \(a',b'\) 需要满足 \(\frac{b'-b}{a'-a} >w\)\(a'-a \ge 1\),所以 \(b'-b \ge w\)。那么此时少表演一次让 \(a' \to a'-1,b' \to b'-w\) 不劣,也就是说可以通过调整使得 \(b' <w\)。又因为 \(b \ge 0\),故不可能。

那么最短路维护 \(f_{u,x}\) 表示走到 \(u\),经过最大值为 \(w_x\) 时的最小表演次数与达到最小表演次数时最大余额。时间复杂度 \(O(nm\log m)\)

QOJ8056 Travel 2

注意到我们可以通过询问得知的东西并不多,甚至好像全是无用信息。所以尝试直接做。

一次询问可以直到点 \(u\)\(x\) 条边连向了点 \(v\)。但不知道点 \(v\) 的第几条边连向了 \(u\)。但是在已知 \(v\)\(d_v-1\) 条边指向谁时是可以通过前面的关系推出 \(u\) 的。

考虑模拟 DFS 树。分情况:

  1. 走一条没走过的边,到达了 DFS 树上的一个儿子。此时继续向下。
  2. 走一条没走过的边,到达了 DFS 树上的一个祖先。若祖先能够得知所有边,原路返回;否则继续向下。
  3. 走一条走过的边,继续向下。

这样时时刻刻都在走新边,而原路返回显然只是 DFS 树上的边。所以总数是 \(2m+2(n-1)\) 的。

P3175 [HAOI2015] 按位或

转化成求 $E(\min\limits_{x\in T}^{}t_x) $。定义 \(f(x)\) 为选到 \(x\) 的期望,那么:

\[f(x)=p_i+(1-p_i)(1+f(x))\\ f(x)=p_i+(1-p_i)+(1-p_i)f(x)\\ f(x)=\frac{1}{p_i} \]

\(E(\min\limits_{x\in T}^{}t_x)=\frac{1}{P(T)}\)\(P(T)\) 表示选到 \(T\) 中任意元素的概率。\(P(T)=1-\sum\limits_{S\cap T =\emptyset}^{}p_s\)。高维前缀和即可。时间复杂度 \(O(n2^n)\)

posted @ 2025-11-03 18:49  harmis_yz  阅读(8)  评论(0)    收藏  举报