Problems

Done

QOJ #970 Best Subsequence $ _{6.3}$

定义 \(f(\{a\},k)\) 为最小的 \(x\) 使得存在一个 \(a\) 的长度为 \(k\) 的子序列首尾相接以后每两个相邻向之和均 \(\le x\)

给定数组 \(a\)\(q\) 组询问,每组询问给定 \(l,r,k\),需要求出 \(f(a[l:r],k)\)

\(1\le n,q\le 10^5,1\le a_i\le 10^9\)。4s 1GB。

View solution

观察给定 \(x\)\(\{a\}\) 之后如何取到最大的 \(k\)。发现将所有 \(\le \lfloor \frac x2\rfloor\) 的数选上一定不劣。然后继续发现每一个 $ > \lfloor \frac x2\rfloor$ 的数的连续段都只能选出 \(1\) 个。

到这里解法就是自然的了:在外层对所有询问进行 \(\log V\) 次二分,再对于每轮二分离线所有询问并 \(n\log n\) 维护。

总复杂度为 \(O(n\log n\log V)\)

QOJ #6101 Ring Road $ _{6.7}$

给定一棵 \(n\) 个点、以 \(1\) 为根的树,边有边权。保证点编号为一个 \(\text{dfn}\) 序。保证根的度数 \(\ge 2\)

树上还有一些附加边,具体地,这些边会按 \(\text{dfn}\) 序将所有叶子节点连起来。

询问 \(q\) 个点对之间的最短路。\(1\le n\le 10^5,1\le q\le 2.5\times 10^5,1\le w\le 10^{12}\),4s 1GB。

View solution

考虑分治,发现度数比较大的时候不太好做。于是考虑将所有的点的孩子数量转成 \(2\),然后进行边分治。

容易发现经过这个操作,每次分治的连通块之间一定只有 \(O(1)\) 条边,于是暴力从这些边跑 SSP 即可。

复杂度 \(O(n\log^2 n+q\log n)\)

QOJ #3998 The Profiteer $ _{6.5}$

给定长度为 \(n\) 的数组 \(v,a,b\) 和整数 \(k,E\)。保证对于每个 \(1\le i\le n\) 都有 \(a_i<b_i\)

\(f(x,\{w\},\{v\})\)\(|w|=|v|=m\))为对价值为 \(w\),重量为 \(v\)\(m\) 个物品做容量为 \(x\) 的背包问题所得到的最大价值。

求有多少个区间 \([l,r]\) 使得将下标在 \([l,r]\) 之间的 \(a_i\) 全部替换为 \(b_i\)\(\frac 1k \sum\limits_{i=1}^k f(i,a',v)\le E\)

\(1\le n,k\le 2\times 10^5,nk\le 10^7,1\le E\le 10^9,1\le v_i\le 10^4,1\le a_i<b_i\le k\)。1s,512MB。

View solution

由于背包的定义,对其删去一个元素是简单的,直接减就行。

\(r\) 显然关于 \(l\) 有单调性。

考虑进行一个整体二分,序列范围 \([l_1,r_1]\),决策点范围 \([l_2,r_2]\),每次求出中点的决策点然后递归做。

求中点的决策点也需要二分,这个二分时需要把所有已确定的位置填上,就能做到只进行线性次插入。

时间复杂度:\(O(nk\log n)\)

P5984 Podatki drogowe $ _{6.5}$

给定一棵 \(n\) 个点的无根树,点的编号为 \(1\)\(n\),边的边权均为 \(n\) 的正整数次幂。

定义 \(u\)\(v\) 的距离 \(\operatorname{d(u,v)}\)\(u\)\(v\) 在树上的简单路径经过的边的边权之和。

给定 \(k\),请在 \(\dfrac{n\times (n-1)}{2}\)\(\operatorname{d(u,v)}(1\le u<v\le n)\) 中找到第 \(k\) 小的值。

View solution

发现不会有进位,于是线段树维护数值,然后外面二分后淀粉质李双指针一下。

然后发现具体的二分中点不好找。于是淀粉质过程中随机一个在二分区间里的点即可。

还有就是二分次数过多会 T,于是卡时。

P9717 [EC Final 2022] Binary String $ _{6.3}$

给定一个排列在环上的二进制字符串 \(a_0a_1a_2\dots a_{n-1}\)。每一秒钟,你会同时将每个 \(01\) 变为 \(10\)。换句话说,如果 \(a_i = 0\)\(a_{(i+1) \bmod n} = 1\),则交换 \(a_i\)\(a_{(i+1)\bmod n}\)。例如,我们将 \(\texttt{100101110}\) 变为 \(\texttt{001010111}\)

你需要回答在无限秒内会出现多少种不同的字符串,取模 \(998244353\)

\(1\le n\le 10^6,1\le \sum n \le 10^7\),2s 1GB.

View solution

注意到答案是 \(O(n)\) 首先假设 \(\text{cnt}_0\le \text{cnt}_1\),反之容易反转使得以上条件满足。

容易发现一个连续的 \(0\) 段一定会每 \(2\) tick 就消失一个。那么这个可以直接模拟,注意为了在实现的时候防止绕回来形成新段的情况,使用 Raney 定理找到一个前缀 \(1\) 个数 \(\ge\) 前缀 \(0\) 个数的位置开始做即可。

消掉所有的连续 \(0\) 后的答案即为其最小循环节。

CF1815E Bosco and Particle $ _{6.9}$

非常好 Ad-hoc 题目,令人眼前一黑。

有一条长度为 \(n+1\) 的直线,最顶端为位置 \(0\),最底端为位置 \(n+1\)。粒子初始时刻(\(t=0\))位于位置 \(0\),并朝向下方运动。粒子的速度为每秒 \(1\) 个单位。在位置 \(1,2,\ldots,n\) 各有一个振荡器。

每个振荡器由一个二进制字符串描述。每个振荡器的初始状态为其二进制字符串的第一个字符。当粒子撞击某个振荡器时,如果该振荡器当前状态为 \(1\),粒子会反向运动;如果当前状态为 \(0\),粒子会继续保持原方向运动。随后,该振荡器的状态会切换到下一个(最后一个状态的下一个定义为第一个状态)。此外,每当粒子在 \(t>0\) 时到达位置 \(0\)\(n+1\),粒子都会反向运动。

求粒子运动的循环节长度对 \(998244353\) 取模,可以证明循环节总是存在。\(1\le n,\sum |s_i| \le 10^6\)。2s,1GB。

View solution 发现这个东西很难维护。于是找性质。

考虑 \(n=1\) 时的做法,发现循环节长度为 \(O(|s|)\),并且可以模拟出 \(0\leftrightarrow 1\)\(1\leftrightarrow 2\) 这两个缝隙被经过的次数,记作 \(a_i,b_i\)

我们惊人的发现:在其他震荡器存在的情况下,对于随意一个震荡器 \(i\),一个完整循环节内 \(i-1\leftrightarrow i\),\(i\leftrightarrow i+1\) 两个缝的经过次数之比一定为 \(a_i:b_i\)

注意到答案即为最小的满足以上比值限制的一组解的每项求和的两倍,这个随便维护一下,做完了。

P9310 [EGOI 2021] Luna likes Love $ _{5.4}$

有一个值域在 \(1\sim n\),且每个数均出现了 \(2\) 次的长度为 \(2n\) 的数组 \(a\)

有两种操作,一种是交换相邻两项,还有一种是删去相邻的两个相同的数。

求出清空序列所需的最少操作次数。\(1\le 5\times 10^5\),1.5s,256MB。

View solution 注意到所有相交的区间一定需要一次交换。

答案即为相交区间个数。直接扫描线即可。

too hard!

P9047 [PA 2021] Poborcy podatkowi $ _{6.7}$

牛啊!

给定一棵 \(n\) 个点的树,你可以选择若干条长度为 \(4\)(指 \(4\) 条边) 的边不相交链(可以不选)。

每个选链的方案的收益为所选链的并集的边权和,求最大收益。

\(2 \leq n \leq 2 \times 10^5\)\(-10^9 \leq a_i \leq 10^9\)。2s 1GB。

View solution 套路地,设 $f_{i,j}$ 为以 $i$ 为根,根下接了一个未被满足的长度 $j$ 的链。

合并新儿子时有三种转移:

  • \(f_{x_1}\)\(f_{y,1}\)
  • \(f_{x,0}\)\(f_{y,2}\)
  • \(f_{x,3}\)

此后有三种做法,有一种基于闵可夫斯基和的做法我还不太会。

Method 1

考虑优化状态,把状态改为 \(f_{x,i,j}\)\(x\) 为根,\(i\)\(f_{?,1}\) 个数的奇偶性,\(j\)\(f_{?,2}\) 个数减去 \(f_{?,0}\)(可能为负)。

注意到有一个经典 trick,如果将孩子随机打乱,由于最终的和需要为 \(0\),最优解过程中 \(j\) 的最大绝对值期望为 \(O(\sqrt{n})\),且不会飞太远。于是将 \(j\) 限制在 \(-500\sim 500\) 之间即可。复杂度 \(O(n^{1.5})\),跑得飞快。

Method 2

使用 wqs 二分。我们通过给选 \(0\) 加贡献来限制 \(0,2\) 选的个数差。复杂度 \(O(n\log V)\)。跑的飞慢。

P7444 「EZEC-7」 猜排列 $ _{6.5}$

给定一个长度为 \(n\) 的序列 \(c_0\sim c_{n-1}\)。保证 \(\sum c_i=\frac{n(n+1)}2-1\)

求有多少个 \(0\sim n-1\) 的排列 \(a\) 使得对于每个 \(i\in 0\sim n-1\) 都恰好有 \(c_i\)\(a\) 的子区间 \([l,r]\) 满足 \(\text{mex}(a[l:r])=i\)

\(1\le n\le 5\times 10^5,c_i\ge 0\)。1s 128MB。

View solution 发现直接做很难多项式复杂度,故先对着这个思考。

\(c\) 作前缀和,可以发现此时所有区间 \(\text{mex}\le i\) 的区间被最靠左的 \(\le i\) 的数和最靠右的 \(\le i\) 的数确定。

于是便有 \(f_{i,l,r}\) 的 DP,再注意到每个 \(l\) 只会对应一个 \(r\) 并且转移只有 \(1\) 种,于是有 \(n^2\) 做法。

又注意到对于每个 \(i\) 只有 \(O(\sqrt(n))\) 种可能取值。于是复杂度可以做到 \(O(\sqrt(n))\)

Todo:

QOJ #5439 Meet in the Middle

posted @ 2025-11-12 15:59  HgSO4qwq  阅读(12)  评论(0)    收藏  举报