专栏文章

1011联考题解

个人记录参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@minmw58w
此快照首次捕获于
2025/12/02 05:01
3 个月前
此快照最后确认于
2025/12/02 05:01
3 个月前
查看原文

T1 那头与艺术

首先特判掉 aa 中所有元素相同的情况。
容易发现答案有一个下界:aa 中众数出现的次数加一。
具体的,记众数为 A\text{A},任意一个其他的数为 B\text{B}。那么 b,cb,c 形如 ..A..A..B..A..A..A..\text{..A..A..B..A..A..A..}。显然可以通过循环移位使得 b,cb,c 中只包含 A\text{A}B\text{B} 的子序列相等。
尝试构造取到这个下界。 一种构造方案是 bbaa 升序排列后的结果,cc 通过不断降序取 aa 中剩余元素各一个得到。
例如:a={1,3,2,4,2,3,4,4}a=\{1,3,2,4,2,3,4,4\},则构造 b={1,2,2,3,3,4,4,4},c={4,3,2,1,4,3,2,4,3,4}b=\{1,2,2,3,3,4,4,4\},c=\{4,3,2,1,4,3,2,4,3,4\}。容易发现上述构造符合要求。

T2 那头与追忆

问题本质即为区间笛卡尔树所有子树 sizesize 和。
考虑算 aia_i 结点在整个序列的笛卡尔树 sizesize 大小,考虑找到 ii 左边第一个比他大的位置 +1+1,右边第一个比他大的位置 1-1,分别记为 li,ril_i,r_i,它的 sizesize 即为 rili+1r_i-l_i+1,加上每次询问区间的限制 [ql,qr][ql,qr] 即为 i=qlqr(min(qr,ri)max(ql,li)+1)\sum\limits_{i=ql}^{qr}(\min(qr,r_i)-max(ql,l_i)+1)
分别做 min(qr,ri),max(ql,li)\min(qr,r_i),\max(ql,l_i),这里以 min(qr,ri)\min(qr,r_i) 为例:
离线做扫描线,对于 ii 维护每个 jjjij\le i)此时的 min(i,lj)\min(i,l_j),按 ljl_j 排序,在 i>lji>l_j 时单点修改即可。
max(ql,li)\max(ql,l_i) 是类似的。
时间复杂度 O(nlogn)O(n\log n)

T3 那头与星铁

考虑 GG' 合法的条件。有一个显然的充要条件是对于每个环,GG' 中权值最大的边与 GG 中权值最大的边相同。
尝试刻画边之间的大小限制。按边权从小到大加边,设当前加入的边为 ee,那么限制 ee 的边权大于加边后 ee 所在点双中的其他所有边。实际上,对于每个点双,取这个点双最新出现的边作为代表边,那么如果在 ee 加入前 u,vu,v 位于同一点双中,只需要限制 ee 的边权大于这个点双的代表边。
否则限制 ee 大于 uu 所在边双代表边和 vv 所在点双代表边。 发现上述限制关系构成一棵森林。我们需要求该森林的拓扑序个数。根据经典结论,设 ee 加边后 ee 所在点双大小为 szesz_e,答案即为 m!sze\frac{m!}{\prod sz_e}。暴力实现上述做法复杂度 O(n2)O(n^2)
现在我们只需要动态加边维护点双。为了方便实现,可以先加入 GG 的最小生成树上的所有边。动态维护圆方树,对于每个圆点 uu,用并查集维护 uu 的父亲(一个方点)。当前的设当前加入的边为 (u,v)(u,v),如果 LCA(u,v)\text{LCA}(u,v) 是一个方点,则把路径上所有方点合并到 LCA(u,v)\text{LCA}(u,v),否则合并到 faLCA(u,v)fa_{\text{LCA}(u,v)}。找到路径上的方点只需要不断跳 u,vu,vdepdep 较大的一个即可。复杂度 O(nlogn)O(n\log n)

T4 那头与串串

S[l,r]S[l,r] 表示可重集 {al,al+1,,ar}\{a_l,a_{l+1},\ldots,a_r\}。对于每个 ii,记 nxtinxt_i 表示满足 j>i,aj=aij>i,a_j=a_ijj,如果不存在则为 1-1
对于一个区间 [l,r][l,r],如果存在区间 [l,r][l',r'] 满足 S[l,r]=S[l,r]S[l,r]=S[l',r']r<lr<l',则这等价于 rl+1=rl+1r-l+1=r'-l'+1mini[l,r]nxti=l,maxi[l,r]nxti=r\min\limits_{i\in[l,r]}nxt_i=l',\max\limits_{i\in[l,r]}nxt_i=r'。这还意味着 [l,r][l',r'] 是唯一的满足 S[l,r]=S[l,r]S[l,r]=S[l',r'] 的区间 [l,r][l',r']。我们称 [l,r][l',r'][l,r][l,r] 的关键区间。
考虑一个大于两个集合构成的等价类 {[l1,r1],[l2,r2],,[lk,rk]}\{[l_1,r_1],[l_2,r_2],\dots,[l_k,r_k]\}。我们钦定 li<li+1l_i<l_{i+1}。容易发现这种情况只会发生在 r1lkr_1\ge l_k 时。发现对于相交的 [l,r][l,r][l,r][l',r']lll\le l'),S[l,r]=S[l,r]S[l,r]=S[l',r'] 当且仅当 [r+1,r][r+1,r'][l,l1][l,l'-1] 的关键区间。
我们希望对于 [li,ri][l_i,r_i] 只减去 [li+1,ri+1][l_{i+1},r_{i+1}] 的贡献方便统计。考虑如下算法:先默认答案为 n×(n+1)2\frac{n\times(n+1)}{2},枚举 ll,增加 rr,如果存在 [l,r][l',r']lr+1l'\neq r+1,则将答案减一;如果 ll' 对于这个 ll 首次出现,则将答案额外减一。容易发现上述算法的正确性。直接实现复杂度小常数 O(n2)O(n^2)
尝试加速统计。从右到左扫描 ll,对于每个 rr,维护 mnr,valrmn_r,val_r 表示 mini[l,r]nxti\min\limits_{i\in[l,r]}nxt_imaxi[l,r]nxtimini[l,r]nxti(rl)\max\limits_{i\in[l,r]}nxt_i-\min\limits_{i\in[l,r]}nxt_i-(r-l)。这可以通过一个经典的单调栈技巧实现(通过单调栈将 cmax,cmin\text{cmax,cmin} 操作转为区间加减)。需要统计所有 sumr=0sum_r=0 的位置以及满足 sumr=0sum_r=0 的位置中 mnrmn_r 出现的种数。由于 sumr0sum_r\ge0,所以统计 sumr=0sum_r=0 的个数只需要记录 sumrsum_r 的最小值以及最小值的个数。由于 mnrmn_r 不增,种数即为颜色段数。这些信息都是容易合并的,直接用线段树维护即可,复杂度 O(nlogn)O(n\log n)

评论

0 条评论,欢迎与作者交流。

正在加载评论...