突然发现只有我没写过 AT。

没写题解不意味着没做,有的忘了写或者太草率了就算了。

部分前言删了。

ABC020D

题解
\[\sum_{i=1}^n\operatorname{lcm}\{i,k\}
\\=k\sum_{i=1}^n\frac i{\gcd\{i,k\}}
\\=k\sum_{d|k}\frac1d\sum_{i=1}^ni[\gcd\{i,k\}=d]
\\=k\sum_{d|k}\sum_{i=1}^{\lfloor\frac nd\rfloor}i[i\perp\frac kd]
\\=k\sum_{d|k}\sum_{i=1}^{\lfloor\frac nd\rfloor}i\sum_{g|i,g|\frac kd}\mu(g)
\\=k\sum_{d|k}\sum_{g|\frac kd}g\mu(g)\sum_{i=1}^{\lfloor\frac n{gd}\rfloor}i
\\=k\sum_{T|k}(\sum_{d|T}d\mu(d))\sum_{i=1}^{\lfloor\frac nT\rfloor}i
\\=k\sum_{T|k}M(T)S(\lfloor\frac nT\rfloor)
\]

其中

\[M(n)=\sum_{d|n}d\mu(d)
\]
\[S(n)=\frac{n(n+1)}2
\]

直接暴力计算即可。

ABC241G

题解

有趣而套路的网络流建模题。

考虑假设某元素是否可行,转化为判定问题:每个未被匹配的边要选择一个赢者,且每个元素被选择次数有限。

这个问题感觉就不能贪心!感觉和图匹配很像!

因此构造网络流图,对一条未被取用的边 \((a,b)\),向一个点 \(u_{a,b}\) 连边,\(u_{a,b}\) 向汇点连边;源点向每个点连次数上界容量的边,或者说这么多条容量为 \(1\) 的边。

如果能将每个未被匹配的边都流满,则说明可行,否则不可行。

这个网络流图的点数、边数均 \(O(n^2)\),引用经典结论,Dinic 复杂度为 \(O(n^3)\)。

由于要跑 \(O(n)\) 轮,总复杂度 \(O(n^4)\),可以轻松通过。

ABC268

题解链接

AGC003D

题解

这种数论题目都很套路,感觉没啥意思。

简单来说,注意到 \(v\le10^{10}\),肯定是和 \(v^w\) 相关的复杂度了,其中 \(w<1\)。

首先把每个数的立方因子给除掉,则若 \(a,b>1\) 满足 \({}^3\!\!\!\sqrt{ab}\in\mathbb N\)(下称满足匹配),则其对答案的贡献为其中较大的出现次数;对 \(1\) 特殊处理即可。

显然只用质因数分解即可得到答案,考虑如何质因数分解。

除掉立方因子需要 \(O(n\pi(^3\!\!\!\sqrt v))\) 的复杂度,同时也能分解出其所有 \(\le{}^3\!\!\!\sqrt v\) 的因子,以及剩余部分。

考虑剩余部分 \(w\) 不会有超过 \(2\) 个质因子,且均 \(>{}^3\!\!\!\sqrt v\),考虑分类讨论:

  1. \(w=1\)。这个比较简单。
  2. \(w=p\),只用考虑 \(p\le\sqrt v\) 的质数,显然 \(p>\sqrt v\) 的部分一定无法匹配。
  3. \(w=p^2\),则可以开根找到 \(p\)。
  4. \(w=pq\),由于 \(p,q>{}^3\!\!\!\sqrt v\),\(w\) 必定无法匹配。

然后容易直接计算答案。

总复杂度 \(O(n\pi(^3\!\!\!\sqrt v)+\sqrt v+n\log n)\),其中 \(O(n\log n)\) 的贡献来自于 map(可以哈希表代替),\(\sqrt v\) 来自于线性筛素数(实践时可以写 bitset 埃筛)。

AGC004D

题解

基环树.jpg。

已经保证是 \(1\) 在环上的基环树。

由于 \(1\) 走 \(k\) 步后到 \(1\),故环长为 \(k\) 的因子。

假设环上有一点 \(a\neq1\),满足走 \(1\) 步后到达 \(1\) 号点,则说明环长是 \(k-1\) 的因子。

因此环长 \(=1\)。

于是转化上树结构,以 \(1\) 为根,其余节点均在 \(k\) 步内应到达 \(1\)。

考虑贪心。

某个子树若父亲不是 \(1\) 且已经有最大深度为 \(k-1\),直接把根节点连向 \(1\),即可。

最优性显然。

总复杂度 \(O(n)\)。

AGC004E

题解

铜牌题。

考虑让出口动而不是机器人动,方便思考。

考虑怎样的水平移动行区间是合法的。

假设起点在第 \(b\) 列(列编号 \(1\sim m\)),则从起点往左 \(b_1\) 步、往右 \(b_2\) 步的区间合法,等价于

  • \(0\le b_1<b,0\le b_2\le m-b\)。
  • \(b_1+b_2\le\max\{b-1,m-b\}\)。

接下来把行、列同时考虑。

由于移动的路径是连续的,我们不能简单地界定答案在一个矩形中。

考虑 dp。

假设目前剩余部分左右从 \(l\) 到 \(r\),上下从 \(u\) 到 \(d\),矩形外部分最大能取的量为 \(f_{u,d,l,r}\)。

假设起点在 \((a,b)\),则

\[f_{u,d,l,r}=\max\{
\\(f_{u,d,l,r+1}+\sum_{\max\{u,d-n+a\}\le j\le\min\{d,u+a-1\}}A_{j,r+1})[r-l+1\le b-1],
\\(f_{u,d,l-1,r}+\sum_{\max\{u,d-n+a\}\le j\le\min\{d,u+a-1\}}A_{j,l-1})[r-l+1\le m-b],
\\(f_{u,d+1,l,r}+\sum_{\max\{l,r-m+b\}\le j\le\min\{r,l+b-1\}}A_{d+1,j})[d-u+1\le a-1],
\\(f_{u-1,d,l,r}+\sum_{\max\{l,r-m+b\}\le j\le\min\{r,l+b-1\}}A_{u-1,j})[d-u+1\le n-a]\}
\]

直接 dp,复杂度是 \(O(n^2m^2)\) 的,感觉不能通过(能通过就有鬼了)。

考虑一个剪枝:如果 \(dp\) 中的某个时刻,已经满足了 \(r-l+1\le\min\{b-1,m-b\},d-u+1\le\min\{a-1,n-a\}\),则其不用去更新别的答案;直接把其内部贡献算出来即可。

考虑另一个更强的剪枝:事实上,只要 \(r-l+1\le\max\{b-1,m-b\},d-u+1\le\min\{a-1,n-a\}\) 或 \(r-l+1\le\min\{b-1,m-b\},d-u+1\le\max\{a-1,n-a\}\),就容易构造方案取遍矩形内所有元素!

然后,如果 \(r-l+1>\max\{b-1,m-b\},d-u+1>\max\{a-1,n-a\}\),则 \(f_{u,d,l,r}\) 总为 \(0\)!

然后这样的 dp 常数会很小!感觉可以通过!

但是不会正解,考虑贺一贺题解。

我去,原来暴力 dp 就是正解啊,那没事了(

不懂啊,那为啥要开 \(100\) 迷惑人。

AGC004F

题解

银牌题。

显然只可能为树或基环树。

考虑树的情形。

由于树是二分图,对节点进行分类,若不等量则无解。

否则考虑如何完美匹配。

一对左、右部点的匹配,其需付出其距离的代价;可以猜测存在某个最优完美匹配方案总可增广(基于贪心的方案总可增广,容易验证最优性)。

考虑对每条边计算答案,显然计算时要付出其一侧左右部点数目差的代价。

这样就解决了树的情形。

考虑基环树。

如果是偶环,则左右部点分类的结论不变,考虑计算环上贡献。

这个是经典的「HAOI2008」糖果传递。可以证明总可增广。

如果是奇环,考虑怎么简化处理。

我不为左哦,贺题解!

如果环是奇环,那么环边操作一次就会让黑色点增加 \(2\) 或者让黑色点减少 \(2\)。不难发现,这种情况下如果黑色点白色点的差是偶数就一定可以通过操作这个白边来让整个图有一个解,并且这种边的唯一用处就是用来增加点。

于是我们可以直接给这条基环边的两侧加上全图黑色点与白色点的差除以 \(2\),然后跑树的做法即可。

懂了,就是删掉一条环边,加虚点赋一个权,然后和树一样做哦……

根本想不到!!!

总复杂度 \(O(n)\) 或 \(O(n\log n)\)。(\(O(n)\) 要基排)

AGC005C

题解

经典结论:其最远距离必定到达直径端点之一。

找到出现了至少 \(2\) 次的最大值,作为直径端点。

假设直径长度为 \(d\)。

提取出直径的链,考虑在此基础上加点(显然这个链得存在,容易分析各点数值)。

每个点的距离得 \(\ge\lceil\frac d2\rceil\),其中额外加的点必须在 \((\lceil\frac d2\rceil,d]\) 间。

然后就完了。总复杂度 \(O(n)\)。

开 \(100\) 搞谁心态呢。

AGC005D

题解链接

AGC005E

题解

这就是铜牌题吗。

完全没思路啊!贺题解贺题解!

我去,原来可以原地不动啊,漏看了一个条件;我还以为和象棋车杀将一样,不能原地不动的。

称双方为甲乙,称树为甲树乙树。

那么这个结论就很显然了:如果某时刻甲在 \(u\),乙不在 \(v\) 及 \(v\) 旁,且 \(u,v\) 在乙树距离不小于 \(3\),则无法结束。

在满足此点前,我们考虑到每次甲若移动,必定是走距离不超过 \(2\) 的边。

我们把乙树以乙为根;则,可以证明,在达成 -1 前,每轮移动后甲都在乙的子树中。

于是每轮只有这么 \(2\) 种方法:

  • 甲不动,乙往甲走。
  • 甲动,乙往甲走。

如果甲不动,乙为了抓甲,肯定不会摆烂不动;否则甲可以循环此过程。

如果甲动了,乙仔细分析发现如果自己旁边就算有甲能走到的在乙树上距离不小于 \(3\) 的节点,也不会按兵不动;否则对方就在底下那个位置摆烂了,乙就抓不到甲了。

简而言之,乙只会 keep walking。

而甲则只会在乙刚好处于甲想去的位置附近时 keep sleeping,否则还会 walking。

简而言之,甲只会不停走,一直走到一个合理的点后开摆;乙会不停走,一直走到杀到甲家门口,或者让甲逃之夭夭。

并且显然的是,在摆烂前,甲不会反复横跳;否则总可以直接开摆。

那么我们就可以 bfs / dfs 找出所有甲树上的节点到甲的距离,已经乙树上的节点到乙的距离;如果中间某节点不可作为增广对象,直接不更新,把走向该节点的方案用来更新答案即可。

同时,对每个曾经成功遍历到的节点计算如果直接开摆的收益即可。

总复杂度可以做到 \(O(n)\)。

AGC005F

其实写过题解。

AGC006B

题解

有趣而简单的题目。

容易发现 \(1,2n-1\) 总是无法构造,那么 \(2\le x\le 2n-2\) 呢?

如 \(x=2n-2\),你在最下面一层放一个 \(x-1\quad x+1\quad x\quad x-2\) 的结构,那么 \(x+1\) 和 \(x\) 上面均会有 \(x\),从而只要不到空格则一直有 \(x\),把这个东西摆中间即可。

于是特判 \(n=2\) 与 \(x=2\) 即可通过。

总复杂度 \(O(n)\)。

AGC006C

题解

草真就 C 开始就申必题是吧。

考虑到每次操作即 \(x_{a_j}\leftarrow x_{a_j+1}+x_{a_j-1}-x_{a_j}\)。

于是就是经典套路。

考察差分数组,单次操作就是交换相邻两个数。

把置换取出,进行置换循环分解取幂,于是就得到结果。

高质量 \(10^{-9}\) 精度是吧。/cf

AGC006D

题解

人话题意:写一个 B 的 spj。

我不好说,但是感觉十分困难啊!

考虑沿用「TJOI / HEOI2016」排序的做法进行二分答案。

现在给定的排列变成了 \(01\) 串,考虑怎么做。

注意到中间三个数若出现相邻两个相同,则可以沿用 B 的思路得解。

否则,总是 \(010/101\) 形式,我们再往外考虑一位。

若某处出现相邻两项相同,则合并时会“偏移一位”保持相同,如

   0
001
00101
0010101

所以最终值即为离中点最近的“相邻两项相同”!

同时,对于 \(01010\dots10\) 等情况,容易特判。

总复杂度 \(O(n\log n)\)。

感觉可以优化到线性。

AGC006E

题解

首先,各列只会不变或翻转,同时左右平移。

所以如果某列不合法则可直接判掉。

然后只用记录信息:当前列来自第几列,上下是正是反。

每次操作将交换相距 \(2\) 的两列,同时将三个部分上下翻转。

考虑怎么判断这些信息合法。

首先如果出现奇偶性不同的列,直接不可行。

然后我们发现,依次操作 \((1,2,3)(2,3,4)(1,2,3)(2,3,4)\) 可以实现对四项翻转却不移动。

同时我们发现,依次操作 \((2,3,4)(3,4,5)(1,2,3)(2,3,4)(1,2,3)(3,4,5)\),可以实现对 \(1,3\) 项翻转却不移动。

再做一次四项的翻转,即可实现对 \(2,4\) 项翻转却不移动。

因此,我们可以认为第 \(3\) 列的翻转与第 \(1\) 列同理,第 \(4\) 列的翻转与第 \(2\) 列同理,等等。

考虑暴力把交换操作完成,则剩下的部分只有翻转操作,容易检验。(像是 \(\mathbb{Z}_2[z]/(1+z^2)\) 的感觉?)

交换的过程可以用各种方法优化,总复杂度容易做到 \(O(n\log n)\)。

感觉可以做到线性!

Update:瞄了眼题解,原来 \(\text{逆序对奇偶性}=\text{排列长度}-\text{置换环数量}\),确实可以 \(O(n)\) 算。

AGC006F

题解

图论转化免不了的。

考察一个点数 \(n\) 满足 \(3\nmid n\) 的环(\(n=1\) 即单个自环,\(n=2\) 则为一组双向边),其会变成一个有向完全图(含自环);否则不能。证明较为简单。

设为 \(n\) 个点的环,\(1\rightarrow2\rightarrow3\rightarrow\dots\rightarrow n\rightarrow1\)。

我们不难发现,\(i\rightarrow i-2\) 的边都可连。

因此我们可以继续进行该操作,变成 \(i\rightarrow i+4\) 的边都可连,变成 \(i\rightarrow i-8\) 的边都可连,等等。

从而,\(i\rightarrow i+(-2)^k\) 的边都可连。

进一步容易归纳,\(i\rightarrow i+3k+1\) 的边都可连,其中 \(k\in\mathbb Z\)。

于是若 \(3|n\),则容易发现不能变成有向完全图。

否则,容易发现有向完全图上各边总可被构造。

(哪怕这不是简单环,也一定程度上适用该分析,如 \(1\rightarrow2\rightarrow3\rightarrow1\rightarrow4\rightarrow5\rightarrow1\))

对于一个有向完全图(含自环),你在往其 / 从其连一条边,其仍然会变成有向完全图(含自环)。

这样就容易分析我们的理论了:

我们称每个点的点权为 \(0/1/2\)(在 \(\mathbb Z_3\) 下操作,即对 \(3\) 取模)。

对于每个联通块,我们考虑,称一条边终点的权值为起点的权值 \(+1\),起点的权值为终点的权值 \(-1\);如果出现矛盾,则说明其为有向完全图。

否则,任意两个权差为 \(1\) 的点都有连边。(要特判只有 \(2\) 种权值的情况)

对有向边建反边,对每个联通块做一遍 dfs 即可。

总复杂度 \(O(n)\)。

AGC007B

题解

怎么 B 就这么毒瘤。

考虑差分。

则 \(a_j=\sum_{k\le j}x_k,b_j=\sum_{k\ge j}y_k\),\(x,y\ge1,\sum x,\sum y\le10^9\)。

\[a_j+b_j=\sum_{k\le j}x_k+\sum_{k\ge j}y_k
\]

我们尝试令

\[a_{p_j}+b_{p_j}=C+j
\]

或者,设 \(q_{p_k}=p_{q_k}=k\),则

\[a_k+b_k=C+q_k
\]

从而

\[x_k-y_{k-1}=(a_k+b_k)-(a_{k-1}+b_{k-1})=q_k-q_{k-1}
\]

然后 \(x,y\) 容易构造:\(x_k=y_k=q_k\);或者一些权值更小的构造。即可。

则 \(a_j=\sum_{k=1}^jq_k,b_j=\sum_{k=j}^nq_k\),即可。

权值在 \(1\sim n(n+1)/2\) 内。

总复杂度 \(O(n)\)。

AGC007D

题解

原本以为会很难,仔细想了想也没这么难。

首先走过某处时会顺带把糖果投了,显然不劣。

然后由于总的路径是从左往右的,这部分贡献算好后只用考虑回头路。

容易发现,回头路长度不小于 \(\frac T2\)(假设一直在走路)且互不重叠,我们的任务就是用总长尽可能短的回头路覆盖所有点。

我们把数轴拉宽一倍,这样就是用总长尽可能小的线段,满足每段均不小于 \(T\),覆盖所有目标点。

考虑令每段线段的起点都是一个目标点,我们可以凭此进行 dp。

我们考虑设 \(f_p\) 为已经考虑了 \(p\sim n\) 的所有点,且从 \(p\) 引出了一条线段的最小代价。

\[f_p=\min_{t\ge p}\{f_{t+1}+\max\{x_t-x_p,T\}\}
\]

这个东西容易单调队列维护。

总复杂度 \(O(n)\)。

AGC007E

题解

申必银牌题。

经过每个节点恰好两次,也就意味着只有进 / 出子树的过程。

由于是二叉树,只能有先左后右 / 先右后左两种走法。

考虑怎么办。

假设二分答案是否 \(\le v\),考虑怎么做。

\[f(p,a,b)=\begin{cases}[a=b=v_p]&p\textrm{ is leaf.}\\\begin{matrix}f(s_1,a-v_p,w_1)f(s_2,w_2,b-v_p)[w_1+w_2\le v]\\\lor f(s_1,b-v_p,w_1)f(s_2,w_2,a-v_p)[w_1+w_2\le v]\end{matrix}&\textrm{otherwise.}\end{cases}
\]

直接做不方便,不妨考虑 \(\le\) 的状态设法。

\[f(p,a,b)=\begin{cases}[a\ge v_p,b\ge v_p]&p\textrm{ is leaf.}\\\begin{matrix}f(s_1,a-v_p,w)f(s_2,v-w,b-v_p)\\\lor f(s_1,b-v_p,w)f(s_2,v-w,a-v_p)\end{matrix}&\textrm{otherwise.}\end{cases}
\]

对一组 \((a,b)\),我们只用维护其最优解的单调栈:\(a\) 升则 \(b\) 减。

直接做也太惊悚了,我们考虑怎么高质量地解决。

考虑到,要对于 \(s_1\) 中的每个 \(a\),找到一个尽可能小的 \(b\),使得其中间合并合法。

考虑怎么办。

容易发现,最终 \((a,b)\) 对的个数不会多于 \(2\min\{\text{第一部分个数},\text{第二部分个数}\}\)。

因此少者逐层翻倍,多者最多作为多一次。

于是就得到一个类似启发式合并的结果,复杂度得到保证。

AGC007F

题解

银牌题,感觉很有趣。

考虑一个贪心。

我们每个节点记录被使用时间的时间戳 \(t_i\),从后往前考虑。

如果当前末尾字符相同,直接跳过。

如果不同,找到上一个相同处,如果找不到直接无解;否则,我们考虑找到上一次出现的位置 \(p\),将这之间的时间戳都更新为区间最大时间加 \(1\),并把区间内元素都赋为相同值。

复杂度容易做到 \(O(n)\)。

然后这个做法是假的!

因为修改不一定要一次性全部赋好,可以分批进行。

譬如

abacddd
aabbccc

可以在两步内完成。

abacddd
abbcccc
aabbccc

而按刚刚的贪心则是 \(3\) 步。

abacddd
abacccc
abbbccc
aabbccc

究其原因,是我们可以把当前修改的时间戳与前一项达成平衡。

因此,假设某区间的时间戳非 \(0\),并且要从外索求时,可以分段考虑,避免对初始被复制的元素造成干扰。

但是这个观察还是太浅显了。

我们发现,整体的赋值过程还是初始的,问题只在于如何最小化时间。

考虑到,我们每次的赋值实质为一个左右端点分别递增的区间。

由于相邻不相交的区间不相干扰,我们分开考虑。

如上例,每次操作可以画成这样:

   oooo
ooo
oo

同时,我们可以把一个线段拆成若干段,使得

  x
ooo
->
oox
oo
  x
x
ooo
->
oox
ox
oo

从而减小总高度。

我们考虑依次添加各条线段,显然右端点部分只用维护到目前右端点为止的信息。

我们发现,加入一条线段的过程,实质上就是给所有元素增高 \(1\),同时从左边一个值域相同段向右边一个值域相同段添加一项元素!

我们维护每个位置的高度,再加上懒标记,直接维护处理即可。

总复杂度 \(O(n)\)。

所以这题我自己都能想出来,为啥能有银牌啊。

AGC008B

题解

怎样的情况是合法的?

只有最长的同色连续段长度 \(\ge k\) 的是合法的。

也即必须得有一段相同的结果。

我们枚举这个相同的结果,其余部分直接计算最优的答案。

总复杂度 \(O(n)\)。

AGC008C

题解

容易发现 \(3,6,7\) 没啥用。

然后容易发现答案即为

\[\def\lf{\left\lfloor}
\def\rf{\right\rfloor}
2\lf a_1/2\rf+a_2+2\lf a_4/2\rf+2\lf a_5/2\rf
\\+[2\nmid a_1\land2\nmid a_4\land a_5>0]\\+[2\nmid a_1\land a_4>0\land2\nmid a_5]+[a_1>0\land2\nmid a_4\land2\nmid a_5]
\]

然后就没了。

这不比 B 简单多了?

虽然 WA 了一发。

AGC008D

题解

感觉很憨啊!

考虑先把已知的位置填了,自然把剩下的都给出了分界。

我们先填“应处于左侧”的元素,并且优先填靠前的;填满后往后填。

另一个方向同理。

最后 check 可行性即可。

这题为啥能有黄啊,不是很认同。

AGC008E

题解

考虑每个置换环,则即 \(i\) 的下项 / 下下项为 \(a_i\)。

进而考虑一个环可能会变成怎样的基环树。

如果全部是下一项,则不发生改变。

如果全部是下下项,则奇环会变成一个错位的环,偶环会变成两个等大的环。

如果既有下项,又有下下项,那会变成一颗基环内向树,并且每个节点最多再外挂一条链,链间还有关联;至少一个节点有外挂链。

因此我们得到的 \(a\) 就是这么一个情况。

我们先把每种长度的环提取出来,按前面几种方法计算答案:假设长度为 \(m\) 的环有 \(c\) 个,考虑其贡献。

\(m=1\lor2\mid m\) 时,取出若干对匹配成偶环,方案数为

\[\sum_k\binom{c}{2k}\frac{(2k)!}{k!2^k}m^k
\]

\(m>1\land2\nmid m\) 时,取出若干对匹配成偶环,剩下的枚举是否错位,方案数为

\[\sum_k\binom{c}{2k}\frac{(2k)!2^{c-2k}}{k!2^k}m^k
\]

然后考虑基环树,其回推的方案。

假设环上有 \(m\) 个节点,环外依次挂着 \(a_1,a_2,\dots,a_m\) 个节点的链;\(a_i=a_{m+i}\)。

如果 \(a_j>0\) 且 \(a_{j-a_j+1}\sim a_{j-1}\) 间有元素 \(>0\),则说明无解。

否则,如果 \(a_j>0\) 且 \(a_{j-a_j}>0\),则第 \(m\) 项元素带来 \(1\) 的系数贡献。

否则,如果 \(a_j>0\),则第 \(j\) 项元素带来 \(2\) 的系数贡献。

(其实就是枚举环外元素的距离是 \(1\) 还是 \(2\))

这样就计算了基环树的贡献。

总复杂度 \(O(n)\)。

AGC008F

题解

对于除了全集外的所有联通块,最小合法 \(d\) 对应的 \(x\) 是唯一的(不要求是关键点);否则容易导出矛盾。

考虑每个 \(x\) 对应哪些最小 \(d\) 合法。

首先

\[d<\max_p\operatorname{dist}(p,x)
\]

显然。

如果有更优的 \(y\) 满足 \(d'<d\) 与此相同,

那么显然

\[d=d'+\operatorname{dist}(x,y)
\]
\[d'\ge\max_{x\text{ 在 }p,y\text{ 路径上}}\operatorname{dist}(p,y)
\]

因此,如果想让 \(y\) 不存在方法使得当前 \(d\) 不优,则应当

\[d-\operatorname{dist}(x,y)<\max_{x\text{ 在 }p,y\text{ 路径上}}\operatorname{dist}(p,y)
\]

也即

\[d<2\operatorname{dist}(x,y)+\max_{x\text{ 在 }p,y\text{ 路径上}}\operatorname{dist}(p,x)
\]

直接 dp 计算出对每个点 \(x\),其 \(\min\{\max_p\operatorname{dist}(p,x),2\operatorname{dist}(x,y)+\max_{x\text{ 在 }p,y\text{ 路径上}}\operatorname{dist}(p,x)\}\)。

然后仍然可能会计重。

但是我们刚刚的做法在全部点都是关键点时是对的(此时 \(\operatorname{dist}(x,y)=1\)),考虑容斥掉某个点 \(x\) 变成普通点后的负贡献。

则必然没有某个含关键点 \(y\) 的儿子子树被其在 \(d\) 内完全包含;否则自己的最优解总可被别的点表出。

然后求和即可。

不要忘了全选的情况。

AGC009B

题解

淘汰赛可以用一个 Leafy Tree 去描述。

考虑怎么建树。

我们先按给被击败的方案,建出一颗树。

显然,其对应的 Leafy Tree 不一定唯一;如果一个节点儿子多于一个,其先后顺序未定。

------------------
| |
-------- s3
| |
---- s2
| |
p s1

我们的任务就是最小化树高。

考虑假设我们已经算出各儿子子树内的答案,我们怎么做当前子树。

直接把树高从小到大排序,依次作为上图中的 \(s_1,s_2,\dots,s_n\),显然最不劣。

总复杂度 \(O(n\log n)\)。

AGC009C

题解

不妨 \(A\le B\)。

如果 \(S_{i+2}<S_i+A\),显然无解;\(S_i,S_{i+1},S_{i+2}\) 无法分组。

因此,我们现在总有

\[S_{i+2}\ge S_i+A
\]

我们考虑 dp。

设 \(W_p\) 表示 \(p,p+1\) 是否可以均在 \(A\) 集合中;即 \(W_p=[S_{p+1}-S_p\ge A]\)。

设 \(f_p\) 表示已经考虑了前 \(p\) 项,第 \(p\) 项在集合 \(B\) 中的方案数。

于是显然

\[f_p=[S_p-S_{p-1}\ge B]f_{p-1}+\sum_{S_p-S_k\ge B}f_k\prod_{k<j<p-1}W_j
\]

然后这个容易双指针做到 \(O(n)\)。

AGC009F

题解

自己做法假了。

贺题解!终于找到一篇能看的下去的题解了:https://www.luogu.com.cn/blog/OUYE2020/solution-at2294

题解原话:

如果你像傻*我一样到了这里就不继续推导而想着优化暴力 DP 的话,那么你最终会在发现自己的四次方五次方 DP 怎么都会把方案算重的时候崩溃掉。

其实我们可以很轻易地发现,当产生进位的时候,低位处减少 \(xk\),高位处会增加 \(x\),此时 \(\sum z\) 刚好减少 \(k−1\) 的整数倍,也就是说 \(\sum z\) 仍满足 \(\sum z\equiv n\pmod{(k-1)}\)。归纳验证发现,\(\sum z\le n\) 和 \(\sum z\equiv n\pmod{(k-1)}\) 这两条限制已经足够。

这个才是最重要的结论!

因此,我们可以略施巧计,把此部分我们的做法变为

\[0\le a_h<k
\]
\[\sum a_h=m-t(k-1),t>0
\]

这样就没有那一坨上取整了。

但是,这也意味着,我们必须同时兼顾 \(0\) 的贡献;因为 \(0\) 此时不一定够用。

类似于上述推导,我们同样得到

\[1+\sum(k-1-a_h)=n-q(k-1),q>0
\]

也即

\[\sum(k-a_h-1)=n-q(k-1)-1,q>0
\]

不过这里假定 \(a_H>0\) 了;对于 \(a_H=0\),应当特殊处理。

因此不妨 \(a_1\sim a_H\) 依次 dp,直接做即可。

总复杂度 \(O(n^2)\) 级别(\(n\sim m\))。

AGC010B

题解

草,读错题了。

那么考虑到,设环上 \(i\) 开始选了 \(x_i\) 个,\(x_i=x_{n+i}\),则

\[\sum_{0\le j<n}(j+1)x_{i-j}=a_i
\]

因此

\[\sum x=\frac{\sum a}{n(n+1)/2}
\]
\[a_i-a_{i-1}=-nx_{i}+\sum x
\]

直接判断是否总是非负整数即可。

总复杂度 \(O(n)\)。

AGC010C

题解

由于路径端点不能相同,我们考虑把树转有根,则每个子树向外连的边数量容易发现是定值。

\[v_p=\begin{cases}a_p&p\text{ is leaf.}\\2a_p-\sum_sv_s&\text{otherwise.}\end{cases}
\]

同时应时刻保证合法性;即

\[v_s\le a_p\le\sum_sv_s\le 2a_p
\]

容易验证这是充要的。

特殊处理一下根节点,直接树形 dp 即可。

总复杂度 \(O(n)\)。

AGC010F

题解

神秘 F 比 E 简单。

容易发现如果可能,总是往更小数走。

无路可走时必废。

然后直接用必胜必败态定理即可。

总复杂度 \(O(n\log n)\),瓶颈在排序。

AGC011C

题解

考虑找到一个奇环 \((p_1,p_2,\dots,p_m)\),则考虑一条边 \((a,b)\),我们有

\[(a,p_1)-(b,p_2)-(a,p_3)-\dots-(a,p_m)-(b,p_1)
\]

因此一个第二维含奇环的联通块,对于第一维的各个联通块,都是分别联通的。只要第一维不是单点

第一维含奇环同理。

考虑两维都不含奇环的非单点的联通块,那就是二分图,点集总可分成左、右部。

容易发现这样的情况恰有 \(2\) 个联通块:两维均在左部,或均在右部;两维一个在左部,一个在右部。这两类分别构成一个联通块。

容易发现这样的情况恰有 \(2\) 个联通块:两维均在左 / 右部;两维的左右部类型不相同。

因此,设单点有 \(a\) 个,含奇环的联通块有 \(b\) 个,非单点的二分图联通块有 \(c\) 个,总点数有 \(n\) 个,则总答案为

\[a(2n-a)+(b+c)^2+c^2
\]

直接做即可。

总复杂度 \(O(n)\)。

AGC011D

题解

嗯,感觉这种题,不手玩没得做啊!

R 表示向右的球,L 表示向左的球。模拟一下样例一、二。

RABAAA LBBAAA

RBBAAA ARBAAA AARAAA AALBAA ABRBAA ABARAA ABALBA ABBRBA ABBARA ABBALB ABBBRB ABBBAR

规律逐渐浮现了:

如果开头为 A,则直接弹回并把开头改为 B

如果开头为 B,会将所有下一项为 A 的元素变为 B,将下一项为 B 的元素变为 A,最后一项变为 A

因此开头为 B 时就是全局轮转并翻转!

当 \(k\) 很小时,我们可以暴力 \(O(n+k)\) 模拟。

我们把这个算法先用伪代码描述一下(A 为 \(0\),B 为 \(1\),从 \(0\) 标号):

\[\def\assign{\leftarrow}
\def\ep{\text{ }}
\def\done{\textbf{done}}
\def\fi{\textbf{fi}}
\def\for{\textbf{for}}
\def\if{\textbf{if}}
\def\else{\textbf{else}}
\def\do{\textbf{do}}
\def\then{\textbf{then}}
\def\in{\textbf{in}}
\def\range{\textbf{range}}
\def\input{\textbf{input}}
\def\output{\textbf{output}}
\begin{array}{l}
\input\ep n\cr
\input\ep a_0,\dots,a_{n-1}\cr
p\assign0\cr
op\assign0\cr
\for\ep cnt\ep\in\ep\range(k)\ep\do\cr
\quad\if\ep a_p=op\ep\then\cr
\qquad a_p\assign1-a_p\cr
\quad\else\cr
\qquad op\assign1-op\cr
\qquad p\assign(p+1)\bmod n\cr
\quad\fi\cr
\done\cr
\for\ep i\ep\in\ep\range(n)\ep\do\cr
\quad\if\ep a_{(p+i)\bmod n}=op\ep\then\cr
\qquad\output\ep\texttt{A}\cr
\quad\else\cr
\qquad\output\ep\texttt{B}\cr
\quad\fi\cr
\done\cr
\end{array}
\]

于是,到了 \(p\) 从 \(n-1\) 变为 \(0\) 的那一步之后,整个序列(按初始时标号)的形态是确定的:\(2|n\) 时为 BABABA...BA,\(2\nmid n\) 时为 BABABA...AB

之后的过程,容易发现 \(a\) 的形态有循环节;在 \(2|n\) 时为 \(n\),在 \(2\nmid n\) 时为 \(4n\)。

其实答案有一个更短的循环节。

直接取模,然后继续模拟即可。

总复杂度 \(O(n)\)。

AGC011E

题解

申必题。

答案不会超过 \(O(\log_{10}N)\) 易证。我们称 \(n=\lceil\log_{10}(N+1)\rceil\)。

假设我们不考虑进位,则得到的数仍然不减。

考虑进位,我们反过来求如果不进位会得到的结果。

则应将高位的部分数向低位回加,直至高位不大于低位。

如果高位又偏小了,则从上上位取;如果上上位又偏小了,则从上上上位取……

这样一直到数列不减,将最后一个数算出其除 \(9\) 上取整的值,即是答案。

容易发现这么贪心是最优的。

我们猜测复杂度可以均摊。但是实际上并不能。

在随机生成的数据下这个东西容易被卡到 \(O(n\log n)\) 级别。

精心构造之下,这个东西可能可以被卡到 \(O(n^2)\) 级别。(我不确定,应该能卡)

因此考虑如何优化这个贪心的过程。

for(int i=n-2;~i;)
if(A[i]<A[i+1])
{
int v=(A[i+1]-A[i]+10)/11;
A[i+1]-=v,A[i]+=v*10,i++;
}
else i--;

这段代码中,\(A_{i+1}\) 将减小 \(\lceil\frac{A_{i+1}-A_i}{11}\rceil\),于是 \(A_{i+2}-A_{i+1}\) 将增大 \(\lceil\frac{A_{i+1}-A_i}{11}\rceil\),又由于此前 \(A_{i+2}\le A_{i+1}\),于是 \(A_{i+2}-A_{i+1}\le\lceil\frac{A_{i+1}-A_i}{11}\rceil\)。

再做一步,得到

\[A_{i+3}-A_{i+2}\le\lceil\frac{A_{i+1}-A_i}{11^2}\rceil
\]
\[A_{i+4}-A_{i+3}\le\lceil\frac{A_{i+1}-A_i}{11^3}\rceil
\]

等等。

因此,在对数轮暴力修改后,修改的变化量将是形如减 \(1\) 的!

我们维护当前的值域相同段,则就是将此段均减 \(1\)。

此后的更新可以直接暴力处理,容易猜测不会再怎么涉及到前半部分值域相同段。

这样的操作,在将耗费 \(O(10+\log_{10}n)\) 的代价同时,获得处理的 \(i\) 范围上的 \(1\) 的增量。

总复杂度 \(O(n\log n)\)?

把之前那个做法卡满 \(O(n^2)\) 的方法大概就是始终维护一个很长的值域相同段?

AGC011F

题解

想睡着了.jpg。醒了后就大概会了。

开始以为自己会 \(O(n)\) 做法,后来发现读错题了……但是也简单。

考虑到其实就是一个形如 \(\searrow\rightarrow\searrow\rightarrow\searrow\rightarrow\nearrow\rightarrow\nearrow\rightarrow\nearrow\) 的曲线横向连续平移无限次,使得其在某些段无交,要求最小化水平距离(不包含中间的水平段)。

我们考虑从下往上扫描,然后容易发现,我们总可以将左半面的 \(\rightarrow\) 加到右半部分去,从而减少讨论。

这样整个的形态就变成了 \(\searrow\searrow\searrow\rightarrow\nearrow\rightarrow\nearrow\rightarrow\nearrow\)。

显然每个 \(\rightarrow\) 的长度可以不超过 \(k-1\)。

在扫描的过程中,我们计算出 \(\rightarrow\) 总长模 \(k\) 为 \(0\sim k-1\) 时的最短总长,设为 \(g_t\)。

当此段允许双向时,我们总是不妨令此 \(\rightarrow\) 长为 \(0\),也即不用改变。

否则仅可单向,假设前面部分 \(A\) 总和为 \(s\),当前部分 \(A\) 为 \(a\),则有

\[g_t'=\begin{cases}+\infty&(-a,0)\cap(t+2s,t+2s+a)\neq\varnothing\text{ 在模意义下}\\g_t&\text{otherwise.}\end{cases}
\]
\[g_t''=\begin{cases}\min_ss+g'_{(t+k-s)\bmod k}&g'_t=+\infty\\g'_t&\text{otherwise.}\end{cases}
\]

考虑到非 \(+\infty\) 的总是一段(模意义下的)区间,我们直接维护此段区间是怎样的分段函数即可。

我们先计算出不变的 \(t\),容易发现,即为 \([-(2s\bmod k),k-2a-(2s\bmod k)]\);特别的,如果 \(2a>k\),说明无解。

考虑暴力维护分段函数,初始 \(g_t=0\)。

每次操作为单点查询、区间修改为公差为 \(1\) 的等差数列。最后全局取 \(\min\)。

因为数据规模较小,不用考虑什么线性做法了,直接 ODT 维护即可。

总复杂度 \(O(n\log n)\)。

AGC012D

题解

考虑单种颜色内部可以怎么换。

我们总是希望把最小元素拿去和外界交换,从而达成目标,因此就是考虑最小元素可以到达哪些位置。

显然是与其和不超过 \(x\) 的位置。

同时我们考虑,能否将两个本不可交换的元素以外力交换?

如果有与此颜色不同,且与两者和均不超过 \(y\) 的元素,则其仍可交换。

假设质量最小数为 \(v\),其对应颜色 \(c\);颜色非 \(c\) 的最小数为 \(v'\)。特别的,只有一种元素时,认为 \(v'=+\infty\)。

如果一个元素 \((C,w)\) 满足 \(c=C\),则其可与别的同色元素交换当且仅当 \(w\le\max\{x-v,y-v'\}\);两个这样的数可以互相交换。

如果一个元素 \((C,w)\) 满足 \(c\neq C\),则其可与别的同色元素交换当且仅当 \(w\le\max\{x-v_{\min\text{in }C},y-v\}\);两个这样的数可以互相交换。

对于一个不满足这些条件的元素,其将不可与任何元素交换,可以直接删去不管。

否则剩下的元素,不同颜色之间,可以考虑方便交换为最小元素,然后再实现互相交换。

因此我们有效的信息只有每个颜色的元素数目和最小元素。

然后如果一个颜色的最小元素 \(>y-v\),其亦不可与其余元素互相交换,可以忽略。

剩下的颜色总可以互相交换,方案数使用多项式系数即可解决。

\[\binom{c_1+c_2+\dots+c_m}{c_1,c_2,\dots,c_m}
\]

总复杂度 \(O(n)\)。

AGC013B

题解

什么玩意。

考虑从一个点开始贪心找没走过的点使劲走。

如果无路可走了,再从起点引出一条路径直至再次无路可走。

两条路径的并即为答案。

正确性显然。

AGC013C

题解

怎么都这么喜欢蚂蚁题。

考虑到交换位置相当于是给点交换蚂蚁,我们只用考虑每个位置是哪个蚂蚁即可。

我们发现,交换不会改变蚂蚁的先后次序,只有经过环边界会把最后一只蚂蚁送到开头 / 开头一只蚂蚁送到最后。

我们只用计算有多少次送到开头 / 最后的操作,即可确定最终次序。

最后归并求出位置即可。

总复杂度 \(O(n)\)。

AGC013D

题解链接

AGC013E

题解

憨憨题。为啥有铜牌。

忽略掉现实背景,考虑直接以间隔点为状态 dp。

\[f_0=1,f_p=[p\notin S]\sum_{k<p}(p-k)^2f_k
\]

这个是经典题:遇到幂次就展开!

假设 \(A_p=\sum_{k<p}f_k,B_p=\sum_{k<p}(k-p)f_k,C_p=\sum_{k<p}(k-p)^2f_k\),则也即

\[C_{p+1}=(1+[p\notin S])C_p+2B_p+A_p
\]
\[B_{p+1}=[p\notin S]C_p+B_p+A_p
\]
\[A_{p+1}=[p\notin S]C_p+A_p
\]

作为没脑子选手,当然对每个 \(p\notin S\) 区间进行矩阵快速幂啦!

\[\begin{bmatrix}C_{p+1}\\B_{p+1}\\A_{p+1}\end{bmatrix}=\begin{bmatrix}2&2&1\\1&1&1\\1&&1\end{bmatrix}\begin{bmatrix}C_p\\B_p\\A_p\end{bmatrix}
\]

特别地,对 \(p\in S\) 时,即为

\[\begin{bmatrix}C_{p+1}\\B_{p+1}\\A_{p+1}\end{bmatrix}=\begin{bmatrix}1&2&1\\&1&1\\&&1\end{bmatrix}\begin{bmatrix}C_p\\B_p\\A_p\end{bmatrix}
\]

随便倍增预处理一下即可。

AGC014E

题解

怎样的情况是合法的?

先考虑时光倒流。

我们每次删除一条红边,并将红边两侧点对应的蓝边联通块用一条边链接,要求每步均更新成功。

每次对在当前树上两个用红边链接的蓝边联通块断红边,连蓝边。

因此在蓝树上看来,就是一个红边连接的两点之间只有一条蓝边还没有恢复,将其所在联通块合并。

我们每次找到这么一条红边并对其合并。

考虑怎么优化这个东西的复杂度。

我们考虑在每个联通块处一旦发现其与其旁边联通块的红边端点集合有交即可认为可合并。

我们把其丢到一颗 Splay 上,发现有交则取出,并提出关于其的“合并请求”。

合并时更新答案可以考虑启发式合并。

由于“应当合并时间”和“实际合并时间”会有差异,应当用一个队列或栈维护“下一步合并操作”。

总复杂度 \(O(n\log n)\) 或 \(O(n\log^2n)\)。为啥?

差异主要在于,使用 Finger Search 来实现则为单 \(\log\),直接用 set 是 \(2\) 只 \(\log\) 的。

AGC015C

题解

感觉是个套路题!

森林的联通块数,是经典的点减边。

只用查询矩阵内有多少点、多少两端均被包含的边即可。

这个容易写二维差分。

总复杂度 \(O(nm+q)\)。

AGC015D

题解

不懂哦,这不是普及组分类讨论?

引理 \(1\):假设 \(2^{m-1}\le R<2^m\),则 \([0,R]\) 可描述 \([0,2^m-1]\) 的所有数。

引理 \(2\):假设 \(2^{m-1}\le R<2^m\),则 \([R,2^m-1]\) 可描述 \([R,2^m-1]\) 的所有数。

特判 \(L=R\) 的情况。

我们把高位全一致的部分去除,则剩下最高位不一致,则 \(L<2^m\le R\)。

枚举目前最高位是 \(0/1\)。

如果是 \(0\),则即 \([A,2^m-1]\) 的答案,显然是 \(2^m-A\)。

如果是 \(1\),则我们可以把此位是 \(1\) 的数均降为 \(0\);由于我们总可以选择 \(2^m\),所以没有影响。

由于引理 \(1\),我们可以把当前信息描述为 \([0,2^t-1]\cup[A,2^m-1]\) 的形式。

如果 \(A<2^t\),答案即为 \(2^m\)。

如果 \(A\le2^{m-1}\),我们可以分类答案是否含 \(2^{m-1}\),继续转化子问题 \([0,2^t-1]\cup[A,2^{m-1}-1]\),并统计 \(2^{m-1}\) 的贡献。

否则,\(2^{m-1}<A\),我们分类最高位,如果为 \(0\) 则是仅有 \([0,2^t-1]\) 带来贡献,否则如果是 \(1\),我们发现答案始终不大于 \(2^m-1\) 且不小于 \(A\)。故其答案即为 \(2^m+2^t-A\)!

仔细观察容易发现 \(A\ge2^t\) 时该情况答案总是 \(2^m+2^t-A\)。

总复杂度 \(O(\log v)\),实现得优秀容易做到 \(O(\log v/w)\)。

AGC015E

题解

注意到本题 \(x,v\) 互不相同,这大大减少了分讨。

我们把 \((v,x)\) 看作平面上的点,则相遇时间即为 \(-\frac{\Delta x}{\Delta v}\)。

考虑只染某个点时的染色点集是怎么样的。

其会染到 \((<v,>x)\) 与 \((>v,<x)\) 的结点。

同时,对于 \((<v,<x)\) 的节点 \((v',x')\),其被染当且仅当存在 \((v'',x'')\) 使得 \(v''<v'<v,x''>x\)。

\((>v,>x)\) 同理。

证明的话,使用几何意义,画个图模拟一下增广过程,就易证了。(每步斜率绝对值不减)

我们把所有节点按 \(v\) 排序,则 \(v_i<v_j\Leftrightarrow i<j\)。

则把刚刚的观察形式化一下,即对一个点 \(j\) 染色覆盖的范围会是一个区间:

\[[\min\{i|x_i\ge x_j\},\max\{i|x_i\le x_j\}]
\]

即坐标最小的 \(x\) 不小于当前点的元素,以及坐标最大的 \(x\) 不大于当前点的元素。

这个东西显然能二分单调栈算出每个区间。

然后即为查询有多少种方法来覆盖满整个区间。

直接做不好做,考虑利用这些区间的性质。

假如有 \(x_i<x_j\),则 \(i\) 的左端点不大于 \(j\) 的左端点,\(i\) 的右端点不大于 \(j\) 的右端点;如果 \(x_i>x_j\),则 \(i\) 的左端点不小于 \(j\) 的左端点,\(i\) 的右端点不小于 \(j\) 的右端点。

通过对 \(x\) 从小到大排序,对相邻项使用该结论,容易发现,随着左端点的单调,右端点也会单调!

考虑 dp,设 \(f_m\) 表示已经考虑了前 \(m\) 项元素,选择了第 \(m\) 项,且把到 \(r_m\) 为止整个区间填满的方案数。

枚举上一项填的元素,则

\[f_t=[l_t=1]+\sum_{r_j+1\ge l_t,j<t}f_j
\]

双指针优化一下,dp 部分复杂度即为 \(O(n)\)。

最后答案即为 \(\sum_j[r_j=n]f_j\)。

总复杂度 \(O(n\log n)\)。

AGC016C

题解

有趣的构造题。

首先 \(h|H,w|W\) 肯定是 No

否则,我们考虑把一个 \(h\times w\) 结构重叠放置多次,然后通过在边界上撒较大值的方式来构造。

即,我们把 \(h\times w\) 的矩形的边角放较大元素,并且使之总和恰为 \(-1\)。

不妨把每个重叠多次的结构 \(h\times w\) 这么构造:

\[\begin{bmatrix}
10^6&0&\cdots&0\\
0&0&\cdots&0\\
\vdots&\vdots&\ddots&\vdots\\
0&0&\cdots&-10^6-1
\end{bmatrix}
\]

这样每次边角的大小就足以把整个 \(H\times W\) 矩形赋为正值了。

总复杂度 \(O(HW)\)。

AGC016D

题解

感觉这种异或之类的套路已经众所周知了啊!

序列开头添一项全部元素的异或值,称作 \(a_0\)(或者 \(b_0\)),则一次操作即为将某元素和开头元素交换。

如果两个可重集不相等,答案肯定是 -1

否则,我们把 \(b_i\rightarrow a_i\) 这个东西画到一张图上(忽略自环),容易发现图变成了若干联通块。

容易发现每个联通块都有欧拉回路。

对于包含 \(a_0\) 的联通块,可以花费边数 \(-[a_0\neq b_0]\) 的代价解决其相关的问题。

否则,每个联通块会带来边数 \(+1\) 的代价。(不考虑自环)

从而解完。

一种比较容易实现的方法的复杂度为 \(O(n\log n)\) 的。

AGC016E

题解

考虑倒推。

我们钦定在某个时刻之后某些元素必须合法。

往前考虑一个操作,如果均不在已考虑范畴则不管,如果一个在一个不在则把不在的那个加上,如果均在则不计入答案。

这个东西,对每对直接暴力做是 \(O(n^2m)\) 的,不够优秀。

考虑优化。

由于这个东西性质很不优美,以及 \(n\) 的奇葩范围,我们不由得考虑起位并行算法。

设考虑了若干步后,\((i,j)\) 对中含有 \(x\) 元素的布尔值是 \(B_{x,i,j}\),当前 \((i,j)\) 已经不合法的布尔值为 \(C_{i,j}\),我们发现每次操作可以使用位并行算法优化!

使用 bitset 即可做到 \(O(\frac{n^3+n^2m}{w})\) 的复杂度。

刚刚这个方法不够优秀,考虑另一个做法:算出为了保留每个元素,需要哪些元素死。

于是就可以做到 \(O(nm+\frac{n^3}w)\)。

AGC016F

题解

容易发现先手胜等价于两个节点的 SG 值不相等。

正难则反,统计多少情况下两个节点的 SG 值相等。

我们考虑按 SG 值递增序状压 dp,并且记录目前已钦定元素。

对于未钦定 SG 值的节点,其向每一个正在钦定的节点的出边中应选择至少一条保留;对于已钦定的节点,其出边任意;对于正在钦定的节点,其出边不可被保留。

每次操作枚举子集即可。

总复杂度 \(O^*(3^n)\)。

由于时限很足,容易通过。

AGC017C

题解

这是不是,就是,「BJOI2019」删数,的弱化版,啊!

直接把板子拉过来改改就是了。

口胡一下做法。

注意到元素在序列的位置对答案没有用,直接从值域考虑。

假设 \(v\) 有 \(cnt_v\) 个,考虑贪心覆盖的过程。

考虑从高到低扫描线,遇到不能覆盖的数就给答案贡献 \(1\),遇到某个 \(cnt>0\) 就更新目前能覆到的最小数。

则一个点 \(p\) 作为未被覆盖的元素带来贡献,当且仅当

\[\forall v\ge p,p\le v-cnt_v
\]

因此我们把单个 \(v\) 描述成 \((v-cnt_v,v]\) 区间加 \(1\),即查询全局 \(0\) 个数。

维护全局 \(0\) 个数即可。

这个东西,开个桶统计一下,容易做到线性。

总复杂度 \(O(n+q)\)。

AGC017D

题解

我们忽略掉根节点,那么对每个子树而言,其互相独立。

考虑计算每个子树的 SG 值。

容易发现这个是一个类似于 Anti-Nim 的结构。

这种东西只能人类智慧了!

对于空子树,其 SG 值是 \(0\)。

对于 \(>0\) 个点的树,由于其总能转移到 \(0\),所以总是非 \(0\)。

对于 \(1\) 个点的树,其 SG 值是 \(1\)。

对于 \(2\) 个点的树,其 SG 值为 \(2\)。

对于一个点俩儿子的树,其 SG 值为 \(1\)。

仨儿子又是 \(2\)。

我们猜测结论:每个节点的 SG 值为各儿子子树的 SG 值之异或和 \(+1\)。

证明?我不会我不会。

其实就是考虑到在各儿子子树的基础上多了一个删父亲边的操作,所以就是这样。

从图游戏的角度,这个证明应该和普通 Nim 游戏的归纳法类似。

然后就直接 dfs dp 就完了。

总复杂度 \(O(n)\)。

AGC017E

题解

首先这个三连块可以只考虑左右两列信息。

对每一侧,只用考虑其是否接地,以及和另一块积木的拼合位置;拼合位置数目是 \(O(h)\) 的。

考虑转化为图论背景:左部点表示在积木左侧接地或者右侧悬空,右部点表示积木右侧接地或者左侧悬空。

那么,我们称一块积木,就是图上的一条有向边。(从左侧连向右侧)

我们的目标,就是把图上的边集,分解为若干条从左部到右部的路径。

我们知道合法的必要条件有:

  • 对于每个有边的联通块,左部点出度之和大于入度之和;
  • 左部点出度不小于入度,右部点入度不小于出度;
  • 对于每个有边的联通块,左部点出度减入度之和等于右部点入度减出度之和。

那么,我们利用欧拉路的结论,大胆猜测,同时满足这几条,就是其合法的充要条件!

证明?鸽了!感觉应该和欧拉路那套理论的证明类似。。。

交了一下直接过了。

AGC018C

题解

假设先均取 \(A\),然后取恰 \(y\) 个 \(B-A\) 贡献,恰 \(z\) 个 \(C-A\) 贡献。

然后按 \(B-A\) 排序来,\(B-A\) 先取 \(y\) 个,没取的再按 \(C-A\) 排序,取 \(z\) 个 \(C-A\) 最优的。

考虑贪心反悔找增广路。对 \(B-A\) 再增量一个,并从已取元素中取最大 \(C-B\) 元素计入 \(C-A\) 贡献,并从 \(C-A\) 贡献中弹出目前最小元素,如不合法则不增广。注意增量时若已经对 \(C-A\) 贡献,应额外讨论。

这个过程容易用堆维护。

(其实就是模拟费用流?)

总复杂度 \(O(n\log n)\)。

AGC018D

题解

考虑反向统计贡献。

一个显然的上界:每个边最多会被计算 \(2\min\{siz_1,siz_2\}-[siz_1=siz_2]\) 次;具体就是左右节点横跳的贡献,容易发现这是一个比较紧的上界。

我们尝试构造方案尽可能取到这个上界。

我们先考虑双重心的情况,容易发现从一侧重心开始,在左右子树任意交替选择,最后到达另一侧重心,即可取满。

再考虑单重心的情况,那么任一子树大小均 \(<n/2\)。

使用经典结论(「ZJOI2018」历史,或者 「POI2015」LOG),我们可以证明,任取重心外一点做起点,以重心做终点,存在遍历整个图的方案使得步步跨过重心

这样唯一会被算不满的贡献就是起点和重心之间的边,直接统计这样的边中最小值,从答案中减去即可。

至于单重心时这个算法的最优性,我们考虑只用证明,无论如何取,至少会有一条和重心相连的边不被取满

容易发现,假设起点在重心为根的树上的某个子树内,那么其到根的路径上的边,总不可能取满贡献。

因此减去权值最小的和重心相连的边的贡献即可。

总复杂度 \(O(n)\)。

AGC019F

题解

考虑 dp。

\[f_{n,m}=\begin{cases}0&n=m=0\\(n(1+f_{n-1,m})+mf_{n,m-1})/(n+m)&0<n\ge m\\f_{m,n}&\textrm{otherwise.}
\end{cases}\]

注意到 \(n+m\) 每步减一,设 \(g_{n,m}=\binom{n+m}{n}f_{n,m}\),则有

\[g_{n,m}=\begin{cases}0&n=m=0\\\binom{n+m-1}{m}+g_{n-1,m}+g_{n,m-1}&0<n\ge m\\\binom{n+m-1}{n}+g_{n-1,m}+g_{n,m-1}&\textrm{otherwise.}
\end{cases}\]

设 \(v_{n,m}=\binom{n+m-1}{\max\{n,m\}-1}\),则

\[g_{n,m}=v_{n,m}+[m>0]g_{n,m-1}+[n>0]g_{m,n-1}
\]

考虑每个 \(v_{x,y}\) 会被几次贡献,容易发现即为 \(\binom{n-x+m-y}{n-x}\)。

因此 \(g_{n,m}\) 即

\[\sum_x\sum_y\binom{x+y-1}{\max\{x,y\}-1}\binom{n+m-x-y}{n-x}
\\=\sum_{k>0}\sum_j\binom{k-1}{\min\{j,k-j\}}\binom{n+m-k}{n-j}
\]

这个东西一脸范德蒙卷积状,但是并不一致,这就很糟糕。

分类讨论转化一下容易变成

\[\sum_{k>0}\sum_{2j<k}\binom{k-1}{j}(\binom{n+m-k}{n-j}+\binom{n+m-k}{m-j})+\sum_j\binom{2j-1}{j}\binom{n+m-2j}{n-j}
\]

看上去没有什么简便易用的公式?

注意到数据范围很小(\(5\times10^5\)),考虑暴力卷积解决。

如,我们使用此公式,则考虑计算

\[\sum_{k>0}\sum_{2j<k}\binom{k-1}{j}\binom{n+m-k}{n-j}
\\=\sum_{k>0}(k-1)!(n+m-k)!\sum_{j<k-j}\frac{1}{j!(n-j)!}\frac{k-j}{(k-j)!(m-k+j)!}
\]

设 \(A_j=\frac{1}{j!(n-j)!},B_j=\frac j{j!(m-j)!}\)。

则即求 \(C_j=\sum_{2k<j}A_kB_{j-k}\)。

这是经典的卷积问题,使用多叉分治可以做到 \(O(n\log^2n/\log\log n)\)。实现得精细可以通过。

只是不知道有没有 \(O(n\log n)\) 的倍增做法,感觉不像有的。

但是肯定没人愿意写这种东西的。。。

EI 给了个代数推导,我也不会,摆。

AGC038E

题解链接

AGC041F

题解

考虑贺题解!

AtCoder 阴间题还是不会做。

为了迎合题解,对行列转置。

枚举不可放车的行集合 \(A\);也即,之前枚举单点的方案中,\(A\) 中每行必定存在至少一个单点,且每个单点对应的行均出现在 \(A\) 中。

考虑每个连续段。(蒯图)

即,对于每一种颜色,考虑其单独某一列上的情况。

显然这对应了一个区间的行,设为第 \(l\sim r-1\) 行。

设 \(len=r-l,p=\sum_{k\in[l,r)}[k\in A]\)。

则我们单纯计算两种贡献。

  • 当 \(p\) 个格子均不被选择时,有 \(2^{len-p}\) 种选择剩余部分的方法。
  • 否则,有 \(\sum_{k=1}^p(-1)^k\binom pk=-[p>0]\) 种方法。

这样子容斥,会统计入某些 \(A\) 的情况,使得其中某些行不对应存在原 \(S\) 中元素。

考虑钦定 \(A\) 一部分行 \(B\) 不对应存在原 \(S\) 中元素。

即枚举 \(B\subseteq A\),额外带上容斥系数 \((-1)^{|B|}\)。

设 \(q=\sum_{k\in[l,r)}[k\in B]\)。

再次单纯计算两种贡献。

  • 当 \(p\) 个格子均不被选择时,有 \(2^{len-p}\) 种选择剩余部分的方法。
  • 否则,有 \(\sum_{k=1}^{p-q}(-1)^k\binom{p-q}k=-[p>q]\) 种方法。

于是贡献即为 \(2^{len-p}-1+[p=q]\)。

换言之,答案即为

\[\sum_A\sum_{B\subseteq A}(-1)^{|B|}\prod_{\text{每一段合法的 }l,r}2^{len-p}-1+[p=q]
\]

继续贺题解。

\[p_{0,8}=p_{0,3}+[3\in A]+p_{4,8}
\]
\[[p_{0,8}=q_{0,8}]=[p_{0,3}=q_{0,3}][3\notin A/B][p_{4,8}=q_{4,8}]
\]

于是考虑树形 dp。

答案柿子是积和形式,尝试运用分配律。

设 \(f_{u,p,[p=q]}\),随便对中间元素分 \(3\) 类讨论一下即可。

JOISC2018I

题解链接

Xmas21C

题解

zaky 给我们布置的作业题。

导出双射后,这题就没什么难点了啊!bijective problem 还是太困难了一些。

假设我们不考虑 ?,则有 key observation:

0 看作小于号,1 看作大于号,即为将 \(0\sim n\) 填入使此不等式组的合法的方案数,也即「LibreOJ NOI Round #2」不等关系

证明?我不会我不会。

考虑到其实可以强制令 0 段满足先删后面的,1 段先删前面的,填的数表示删除时间。

至于更准确的证明描述,去 EI 博客找了一段来:

证明是很简单的,首先我们发现操作序列等价于每次把某个全 0 段或者全 1 段的长度减去 \(1\),考虑每次去掉最大的那个数,这能和删除一个 01 的操作序列进行一一映射。

EI 的证明。

似乎没有毛病。EI txdy!

那么的话,? 就相当于不做限制,可以把两侧分开处理,最后组合数分配标号。

因此只用考虑只有大于、小于号的情况。

以下即为对「LibreOJ NOI Round #2」不等关系的分析。

考虑容斥。

我们把某处为 \(>\) 的答案当作此处不做限制的答案减去此处填 \(<\) 的方案数。

我们称 \(p\) 处为 \(>\) 为 \(a_p=1\),否则 \(a_p=0\)。

我们假设 \(f_m\) 表示已经考虑了前 \(m\) 个符号的方案数,初始时 \(f_0=1\)。

dp 时,我们考虑枚举上一项选择为不做限制的位置,得

\[f_m=(-1)^{\sum_ja_{m-j}}+\sum_ka_{m-k}(-1)^{\sum_{j<k}a_{m-j}}\binom{m+1}{k+1}f_{m-k-1}
\]

化一下柿子,我们设 \(b_m=\sum_ja_{m-j}\),即为

\[f_m=(-1)^{\sum_ja_{m-j}}+\sum_ka_{m-k}(-1)^{\sum_{j<k}a_{m-j}}\binom{m+1}{k+1}f_{m-k-1}
\\=(m+1)!(-1)^{b_m}(\frac{1}{(m+1)!}+\sum_k\frac{a_{m-k}(-1)^{b_{m-k}}f_{m-k-1}}{(m-k)!(k+1)!})
\]

也即

\[\frac{f_m}{(m+1)!(-1)^{b_m}}=\frac{1}{(m+1)!}+\sum_k\frac{a_{m-k}(-1)^{b_{m-k}}f_{m-k-1}}{(m-k)!(k+1)!}
\]

设 \(g_m=\frac{f_m}{(m+1)!(-1)^{b_m}}\),即

\[g_m=\frac{1}{(m+1)!}-\sum_k\frac{a_{m-k}}{(k+1)!}g_{m-k-1}
\]

显然是一个半在线卷积。

总复杂度即为半在线卷积的复杂度,朴素实现的复杂度即为 \(O(n\log^2n)\),多叉分治实现的复杂度即为 \(O(n\log^2n/\log\log n)\)。

由于时限很足,可以轻松通过。

TBA

题解

TBA

题解

TBA

题解

TBA

题解

TBA

题解

TBA

题解

TBA

题解

TBA

题解

TBA

题解

TBA

题解

TBA

题解

TBA

题解

TBA

题解

TBA

题解

TBA

题解

TBA

题解

TBA

题解

TBA

题解

TBA

题解

TBA

题解

TBA

题解

TBA

题解

TBA

题解

最新文章

  1. AlloyRenderingEngine之Shape
  2. Java--Jsp内置对象列表
  3. 第十篇 Replication:故障排除
  4. Java用于取得当前日期相对应的月初,月末,季初,季末,年初,年末时间
  5. HDU 5861 Road (线段树)
  6. Memcached总结四:用ava程序连接memcached进行操作
  7. XML的基本操作
  8. Jenkins系列——使用checkstyle进行代码规范检查
  9. 转log4cxx: Could not read configuration file [log4cxx.properties]解决办法
  10. Revit通过API创建共享参数
  11. [20170612]FOR ALL COLUMNS SIZE repeat(12c).txt
  12. eclipse哪个版本好
  13. 第一章:模型层model layer -- Django从入门到精通系列教程
  14. TCP服务端开发为例--web开发不同url请求为何会走不同方法
  15. Linux系统中最好用的截图软件介绍
  16. vs2015利用python加载dll调试配置
  17. iOS开发-数据存储NSCoder
  18. windows7系统下让所有文件夹都使用同一种视图的方法
  19. css3里面的-webkit-transition
  20. oracle查看字符集和修改字符集

热门文章

  1. 【JVM】根节点枚举与安全点
  2. 终于定制出顺手的Obsidian斜杠命令
  3. CompletableFuture 使用总结
  4. 什么是Rabbitmq消息队列? (安装Rabbitmq,通过Rabbitmq实现RPC全面了解,从入门到精通)
  5. [编程基础] C++多线程入门4-数据共享和资源竞争
  6. nginx: [emerg] &quot;auth_basic&quot; directive is duplicate
  7. 本地文件上传 Gitee 和 GitHub
  8. DVWA靶场实战(十)——XSS(DOM)
  9. 上传图片文件并立即显示到页面使用 javascript实现鼠标拖动画矩形框以及实现固定区域内随意拖动
  10. 日常JS数据各种操作方法总结~~欢迎大家留言板补充哦~~