Loading

ARC108 vp记录

运气好又是简单场,打算下周开一场 AGC。

赛时通过了 ABCDEF(6/6)


A. Sum and Product

题意:给出两个正整数 \(s,p\),求是否存在一组正整数 \(n,m\) 满足:

  • \(n+m=s\)

  • \(n\times m=p\)

\(1\le s,p\le 10^{12}\)

考虑直接枚举 \(n\),范围是 \(O(\sqrt p)\) 的,时间 \(O(\sqrt p)\)


B. Abbreviate Fox

题意:一个长度为 \(n\) 的字符串,不断删去其中为 \(\text{fox}\) 的子串直到不存在,求删完后的字符串长度。

\(1\le n\le 2\times 10^5\)

栈的模板题。每次把一个字符加入栈,然后不断检查栈顶三个字母是否为 \(\text{fox}\)


C. Keep Graph Connected

题意:一张 \(n\) 个点 \(m\) 条边的无向连通图,每条边 \((u_i,v_i)\) 有个取值为 \([1,n]\) 的属性 \(c_i\)。你需要构造 \(d_{1...n}\),然后保留所有满足 \(d_{u_i},d_{v_i}\) 中恰好一个等于 \(c_i\) 的边 \(i\),使得保留边后的图连通。求构造,或报告无解。

\(1\le n\le 10^5,\space n-1\le m\le 2\times 10^5\)

考虑一棵生成树,只需要保留生成树上的边即可。

先给根 \(r\) 随便确定一个 \(d_r\),然后 dfs。当前点为 \(u\),遍历走的边 \(i\) 与走到的点 \(v\),考虑确定 \(d_v\)

  • \(d_u=c_i\):随便给 \(d_v\) 丢一个数,但不能是 \(c_i\)

  • \(d_u\not =c_i\):令 \(d_v\)\(c_i\)

于是这棵生成树就得以保留,时间复杂度 \(O(m)\)


D. AB

一个字符串 \(s=AB\),每次给 \(s\) 中插入一个字符直到长度变为 \(n\),插入规则如下:

  • 不能在开头或末尾插入

  • 给出 \(c_{AA},c_{AB},c_{BA},c_{BB}\)。若在 \(s_i,s_{i+1}\) 中插入,插入的字符为 \(c_{s_i,s_{i+1}}\)

求最后可以得到多少种不同的 \(s\),答案对 \(10^9+7\) 取模。

\(1\le n\le 1000, c\in\{A,B\}\)

输入量很小,其实可以直接打表过。

除了打表,我们可以分讨。

钦定 \(c_{AB}=A\),如果是 \(B\) 是类似的。

那么我们先在两个字符中间插入一个 \(A\)。考虑右边的 \(AA\)

  • 如果 \(c_{AA}=A\),会发现我们目前不管在哪里插入,都只能插入 \(A\),方案数为 \(1\)

  • 如果 \(c_{AA}=B\)

此时可以插入 \(B\),观察发现最后一个 \(B\) 前面的字符必然是一个 \(A\)

证明比较容易,如果是 \(B\),说明我们只能在两个 \(B\) 之间插一个 \(B\) 一条活路,但是前面那个 \(B\) 是哪来的?

所以倒数第二个字符必须是 \(A\),但是前面的字符难道就可以乱排了吗?

因为 \(c_{AB}=A\),我们可以不断在最后一个字符前面插入 \(A\)。考虑先把最终方案中所有 \(A\) 都加入,然后再加入 \(B\)

两个 \(A\) 之间可以插入 \(B\),但是似乎通过这种方式只能插入一个 \(B\)

继续分类讨论:

  1. \(c_{BA}=A\),这样插入一个 \(B\) 后,不管在这个 \(B\) 的左边还是右边都会插入 \(A\),所以此时方案中 \(B\) 的位置不能相邻,方案数是 \(\text{fib}_{n-1}\)

  2. \(c_{BA}=B\),这样可以插入多个 \(B\),除了倒数第二个字符,前面的字符是任意的,方案数 \(2^{n-3}\)

时间复杂度 \(O(n)\),当然还能做到 \(O(\log n)\),所以 \(n\le 1000\) 是来干嘛的。


E. Random IS

题意:一个排列 \(a_{1...n}\),维护一个上升子序列,一开始为空。每次随机选择一个可以加入子序列的数加入,求最终上升子序列的长度期望值,答案对 \(10^9+7\) 取模。

\(1\le n\le 2000\)

考虑随便选择一个 \(a_i\) 作为第一个数,会发现接下来 \(a_{1..i-1}\)\(a_{i+1...n}\) 的计算是独立的,不会相互影响。

根据这个想法,考虑区间 dp,设 \(f[i,j]\) 表示第一个数 \(>a_{i-1}\),最后一个数 \(<a_{j+1}\) 的上升子序列长度期望值。

如果 \(a_{i...j}\) 中没有数字在 \([a_i+1,a_j-1]\) 中,那么 \(f[i,j]=0\)。否则枚举当前选择的数 \(a_k\),转移:

\[f[i,j]=\frac 1{\sum_{k=i}^j [a_i<a_k<a_j]} \sum_{k=i}^j [a_i<a_k<a_j](f[i,j-1]+f[j+1,k]) \]

然后我们需要维护三部分:\(k\) 的个数、合法 \(k\)\(f[i,k-1]\) 之和、合法 \(k\)\(f[k+1,j]\) 之和。

\(i\) 是定值,前两个在扫描 \(j\) 的时候用树状数组维护。第三个考虑对于每个 \(j\) 开一个树状数组维护。

时间复杂度 \(O(n^2\log n)\)


F. Paint Tree

题意:一棵 \(n\) 个点的树,给每个点染黑色或白色,求所有染色方案中 \(\max(\text{黑点两两之间最大距离},\text{百点两两之间最大距离})\) 之和。

如果没有某一种颜色的点,距离为 \(0\)

\(2\le n\le 2\times 10^5\)

考虑直径,设两个端点是 \(x,y\)。如果 \(x,y\) 是同色,贡献是直径长度,方案数为 \(2^{n-1}\)

如果是异色,考虑枚举贡献值 \(i\)。对于每个点,他和其中一个直径端点颜色相同,钦定与 \(x\) 颜色相同。

然后我们可以发现一个结论,同色点两两距离最大值必定是对应颜色的直径端点与其他同色点的距离最大值。

钦定这个端点是 \(x\)。反证,如果 \((u,v)\) 距离最大,有 \(d(u,v)>d(x,u),d(u,v)>d(y,u)\)。设三个点的交点是 \(w\),那么 \(d(v,w)>d(x,w)\Rightarrow d(v,w)+d(w,y)>d(x,w)+d(w,y) \Rightarrow d(v,y)>d(x,y)\),此时 \(v\) 应是直径端点,矛盾。

所以只需要考虑 \(x\) 与其他同色点的距离。

枚举 \(i\) 后,我们可以把与 \(x\) 距离 \(\le i\) 的点染成与 \(x\) 同色,可以把与 \(y\) 距离 \(\le i\) 的点染成与 \(y\) 同色。

这样就可以计算方案数了。如果存在点满足与 \(x,y\) 距离都 \(>i\),方案数为 \(0\)。否则看一下有多少个点与 \(x,y\) 距离都 \(\le i\),这些点可以染成任意颜色,方案数是 \(2\) 的这些点个数次幂。

但是这些方案不一定满足恰好 \(=i\),而是 \(\le i\),把 \(\le i\) 的方案数减去 \(\le i-1\) 的方案数即可,时间复杂度 \(O(n)\)

posted @ 2024-03-17 12:29  Lgx_Q  阅读(14)  评论(0编辑  收藏  举报