• atcoder做题记录


    AGC036

    AGC036B - Do Not Duplicate

    view solution 记录 $nxt_i$ 表示 $i$ 之后第一个数字与 $i$ 相同的位置。那么在 $s$ 为空时加入了 $i$,那么走到 $nxt_i$ 时栈会被清空。可以将 $i$ 向 $nxt_i\bmod n$ 连边,最终会形成若干环。在环上走到最后一次栈清空的位置,此后要加入的数不超过 $n$ 个,可以暴力处理。

    AGC036C - GP 2

    view solution 考虑判断一个最终序列是否合法。

    以下这几个条件是显然需要满足的:

    \[\sum_{i}a_i=3m\\ a_i\le 2m\\ \sum_i(a_i\bmod 2)\le m \]

    在满足这些条件后,不难用 \(Hall\) 定理证明可以找到 \(+1\)\(+2\) 的完美匹配,因此这些条件就是充要条件了。

    注意到不满足条件 \(2\) 的最多只有一个 \(i\)。考虑先不管条件 \(2\) 计算方案数,此时可以枚举奇数 \(a_i\) 的个数然后用组合数计算。然后再暴力枚举不满足条件 \(2\)\(i\),此时就不需要考虑条件 \(3\) 了,可以再用一个组合数计算方案数。

    AGC036D -Negative Cycle

    view solution

    不存在负环等价于该图不存在一组合法的差分约束的解。于是问题转化为找一组差分约束的解使得需要删掉的边的代价之和最小。

    设差分约束的解为 \(x_0,x_1,\dots,x_{n-1}\),那么图中初始的 \(n-1\) 条边意味着 \(x_i\ge x_{i+1}\),考虑差分,设 \(q_i=x_i-x_{i+1}\),因此 \(q_i\ge 0\)

    • \(i\rightarrow j(i<j)\)\(x_i-1\ge x_j\),即 \(\sum_{k=i}^{j-1}q_k\ge 1\)
    • \(i\rightarrow j(i>j)\)\(x_i+1\ge x_j\),即 \(\sum_{k=j}^{i-1}q_k\le 1\)

    因此如果 \(q\) 的某一个区间 \([l,r]\) 满足区间和为 \(0\),则需要删去边 \(l\to r+1\);若区间和 \(\ge 2\),则需要删去边 \(r+1\rightarrow l\)。由于代价均为正,因此我们一定不会选择让某一个 \(q_i\ge 2\)\(q_i\) 只会取 \(\{0,1\}\),且对上两个条件我们只需要考虑相邻的两个 \(1\) 的位置。设 \(dp\) 状态 \(f_{i,j,k}\) 表示填了前 \(i\)\(q\),上一个 \(1\) 的位置是 \(j\) ,倒数第 \(2\)\(1\) 的位置是 \(k\) 的最小代价。转移代价可以用二维前缀和优化 \(\mathcal O(1)\) 求出。复杂度 \(\mathcal O(n^3)\)

    AGC036E - ABC String

    view solution

    首先可以将相邻的相同字母合并到一起。记 \(c_a,c_b,c_c\) 分别为 \(A,B,C\) 的出现次数,不妨假设 \(c_a\le c_b\le c_c\),那么答案的上界就是 \(3c_a\)。为了接近这个上界,取出原串中所有的 \(A\) 将原串分为了若干个部分,每一部分都是 \(BC\) 交替的串。首先考虑删去一些 \(C\) 使得 \(c_b=c_c\),为了满足上界,我们尽量保留所有的 \(a\),优先只删边界上的 \(C\) 或者中间长度 \(\ge 2\) 的部分的边界上的 \(C\)。如果删完还是不够,就只能将只含一个 \(C\) 的部分连带这它旁边的 \(A\) 一起删掉了,显然这样做一定能使得 \(c_b=c_c\)

    满足 \(c_b=c_c\) 后,不断删去连续的 \(BC/CB\) 直到 \(c_a=c_b=c_c\) 即可。

    AGC036F - Square Constraints

    给定 \(n\) ,问有多少个排列 \(0\sim 2n-1\) 的排列 \(\{p_i\}\) 满足:

    对于 \(\forall i\in[0,2n-1]\),有 \(n^2\le i^2+p_i^2\le (2n)^2\)\(n\le 250\)

    view solution

    真神仙题,核心转化:

    • 问题中不合法以及合法的部分都是一段前缀,因此可以想到容斥

    \(l_i=\lceil n^2-i^2 \rceil-1,r_i=\lfloor (2n)^2-i^2\rfloor\)。可以想到经典容斥,枚举某 \(k\) 个数,强制令它们 \(\le l_i\),其他数只需要满足 \(\le r_i\),求出此时的答案。

    每个数只有上限没有下限时,可以将所有数的上限从小到大排序,那么所有前面的数的选择都会导致后面的属选择空间 \(-1\),设第 \(i\) 个数的上限为 \(a_i\),不难得到答案就是 \(\prod_{i=0}^{2n-1}(a_i-i+1)\)

    但直接 \(2^n\) 枚举复杂度太高,考虑用 \(dp\) 维护这个排序求答案过程。由于原问题中只有 \([0,n)\) 中的数是有下界的,因此可以先对 \([0,n)\) 中的数以 \(l_i\) 为关键字,对 \([n,2n)\) 中的数以 \(r_i\) 为关键字从小到大排序。记 \(f_{i,j}\) 表示考虑了前 \(i\) 个数,有 \(j\) 个数被钦定 \(\le l_i\) 时的选择方案数。

    考虑加入第 \(i\) 个数时的转移:

    • 如果 \(i\in[n,2n)\),那么此时它的可选空间为 \(r_i+1\),但还要排除已选择的数中上界 \(\le r_i\) 的:

      • 已经被考虑过的数中上界选择 \(l\) 的,此时由于之前的排序,它们的上界一定 \(\le r_i\),一定占用了 \(j\) 个可选位置。
      • 已经被考虑过的数中没有下界的(也就是 \(\in[n,2n)\) 的),同样由于排序,它们一定会占用可选位置,可以用一个计数器 \(ct\) 来记录这部分数的数量。
      • 已经被考虑过的数中,有下界但上界选择 \(r\) 的,那么对方上界一定比 \(r_i\) 大,不会占用可选位置。

      因此有转移 \(f_{i,j}\gets f_{i-1,j}(r_i+1-j-ct)\)

    • 如果 \(i\in [0,n)\),并且上界为 \(l\),那么分析过程与上一个几乎完全一致,有转移 \(f_{i,j}\gets f_{i-1,j-1}(l_i+1-(j-1)-ct)\)

    • 如果 \(i\le [0,n)\) ,并且上界为 \(r\),那么一开始有 \(r_i+1\) 个可选位置,上限比它小的,就是所有上界选择 \(l\) 的数、所有 \(\in[n,2n)\) 的数,以及在它之前被考虑的 \(\in[0,n)\) 且上界为 \(r\) 的数,考虑在循环外先枚举上界选择 \(l\) 的数数量 \(k\),有转移 \(f_{i,j}\gets f_{i-1,j}(r_i+1-k-n-(i-j-ct))\)

    于是进行一次 \(dp\) 的复杂度是 \(\mathcal O(n^2)\) 的,总复杂度即为 \(\mathcal O(n^3)\),可以通过此题。

    注意排序的时候,如果上界相当,优先将 \(\in[0,n)\) 的排在 \(\in[n,2n)\) 的数前面,因为前者如果选择上界为 \(r\) 则会受后者影响。

    AGC037

    AGC037B - RGB Balls

    view solution

    可以发现直接将每种颜色的第 \(i\) 个球分给第 \(i\) 个人就可以取到最优解。在这个方案中将每个人的第 \(i\) 个球标上 \(i\),能取到最优解的方案中,标 \(1\) 的必须仍然是某人的第一个球,标 \(3\) 的必须仍是某人的第三个球。\(\mathcal O(n)\) 正反扫两遍分别计算标 \(2\) 的球与 \(1,3\) 的匹配方法即可。

    AGC037C - Numbers on a Circle

    view solution

    倒过来考虑从 \(B_i\) 出发,每次让 \(B_i-=B_{i-1}-B_{i+1}\)。考虑任意一个位置 \(i\) 满足 \(B_i>B_{i-1}+B_{i+1}\),那么如果对 \(B_i\) 有操作,那么对 \(B_i\) 的操作一定在对 \(B_{i-1},B_{i+1}\) 的操作之前,因此可以看作这次操作是最后一步进行的,直接让 \(B_i-=B_{i-1}+B_{i+1}\) 即可。如果减到了 \(B_i<A_i\) 则直接判断无解即可。
    为了保证复杂度,可以用堆维护所有的 \(B_i\),每次取出全局最大值 \(B_i\),直接执行多次操作直到 \(B_i<B_{i-1}+B_{i+1}\)\(B_i\le A_i\)为止。这样复杂度就是 \(\mathcal O(n\log n\log W)\)

    AGC037D - Sorting a Grid

    view solution

    考虑从后往前推。

    • \(D\) 推到 \(C\):只要在 \(C\) 中每个元素的行正确,\(C\) 就是合法的。
    • \(C\) 推到 \(B\):将 \(D\) 中同一行的元素染上同一个颜色,只要 \(B\) 中每一列都恰好含有每个颜色的元素各一个,\(B\) 就是合法的。
    • \(B\) 推到 \(A\):考虑将行作为左部点,颜色作为右部点,每行向 \(A\) 中该行出现的颜色连边。那么这张图的一个完美匹配就是 \(B\) 中的一列,一个自然的写法是直接做 \(m\) 次二分图匹配,每次匹配完将匹配边删掉,就能得到矩阵 \(B\)
      注意到在跑了 \(k\) 次匹配后,每个左部点与右部点的度数均为 \(n-k\),使用 \(hall\) 定理即可证明每次匹配都能找到完美匹配。

    AGC037E - Reversing and Concatenating

    view solution

    考虑 \(s\) 中字典序最小的字母 \(c\),我们显然希望最终得到字符串中开头 \(c\) 的出现次数尽可能多。为了到达这一点,如果 \(k>1\),我们会在将字符串翻转后取出最长的一段满足其末尾的 \(c\) 数量最多,接下来每次操作都可以倍长末尾的 \(c\) 长度,最后一步操作再将这段 \(c\) 放到开头即可。

    于是在经过 \(\mathcal O(\log n)\) 次操作后,这段 \(c\) 的长度就会 \(=n\),因此在 \(k>\mathcal O(\log n)\) 时直接输出 \(n\)\(c\) 即可。

    否则,在此基础上最小化这段 \(c\) 之后的字符串 \(s'\) 的字典序。注意到从第二步开始每一步都是在初始的串的基础上最后增加一段 \(c\),因此 \(s'\) 就是第一步保留的字符串除去末尾的 \(c\) 后的部分, \(reverse\) 之后的一个前缀。因此只要在第一步选择的时候保留翻转后字典序最小的串,即可同时满足 \(c\) 的数量最多以及剩余部分字典序最小两个要求。

    AGC037F - Counting of Subarrays

    view solution

    \(L\) 确定后,考虑如何判断一个序列是否合法:

    • 若序列长度为 \(1\),一定合法。
    • 否则,记序列中的最小值为 \(x\),取出所有 \(x\) 的连续段,如果连续段的长度 \(len<L\),那么序列一定不合法。否则将这一连续段缩成长度为 \(\lfloor \frac{len}{L}\rfloor\)\(x+1\) 连续段继续进行判定。如此重复直到序列中只剩一种数字且长度 \(\ge L\)

    照这样做我们将每一个合法区间 \([l,r]\) 分到了级别 \(\max_{i=l}^{r} a_i+1\) 级别上。

    考虑对原串执行判定的过程中同时计算每个子串是否是好串。在对原串进行合并时对每一段 \(i\) 维护 \(L_i\) 表示有多少个原串的前缀被合并到了以段 \(i\) 为结尾的前缀中,\(R_i\) 表示有多少个原串的后缀被合并到了以段 \(i\) 为开头的前缀中。那么每次在合并段 \(l\sim r\) 时:

    • 对于第一种判定,对 \(\forall i\in[l,r]\)\(L_iR_i\) 更新答案。
    • 对于第二种判定,对 \(\forall i,j\in [l,r],j-i-1\ge k\),用 \(L_iR_j\) 更新答案。
      需要注意的是第一种贡献中的 \(L_iR_i\) 可能有一部分在上一次进行合并时就已经被计算了,需要减去。

    于是在合并过程中,动态维护 \(L,R\) 即可,由于将一些段合并后,这些段中元素个数都会除以 \(m\),所以复杂度是正确的。

    AGC038

    AGC038C - LCMs

    给定 \(n\) 个数 \(a_i\),求 \(\sum_{i=1}^{n}\sum_{j=i+1}^{n}\text{lcm}(a_i,a_j)\)

    \(n\le 2\times 10^5,a_i\le 10^6\)

    view solution

    莫比乌斯反演模板题。可以调和级数 \(\mathcal O(V\log V)\),其中 \(V=\max(a_i)\),也可以高维卷积优化到 \(\mathcal O(V\log\log V)\)

    AGC038D - Unique Path

    给定 \(n,m\) 以及 \(q\) 条限制,询问是否能构造出一个 \(n\) 个点 \(m\) 条边的无重边自环的连通图使得满足所有限制:第 \(i\) 条限制形如 \((u_i,v_i,w_i)\),其中 \(w_i=0/1\):若 \(w_i=0\) 表示要求建出的图中 \(u_i\)\(v_i\) 只有一条简单路径,若 \(w_i=1\) 表示建出的图中 \(u_i\)\(v_i\) 有不止一条简单路径。

    \(n,q\le 10^5,m\le \frac{n(n-1)}{2}\)

    view solution 可以发现 $w_i=0$ 限制是具有传递性的:即如果 $a$ 到 $b$ 只有一条简单路径,$b$ 到 $c$ 也只有一条简单路径,那么 $a$ 到 $c$ 只有一条简单路径。

    据此可以将 \(w_i=0\) 的限制看作边,合并得到若干个连通块,那么每个连通块的在原图中的实际连边情况一定是一棵虚树,之所以是虚树是因为可能两点的边上还会有其他点,但为了尽量满足 \(m\) 条边以及 \(w_i=1\) 的限制,出现这样的情况一定不优。所以可以直接认为该连通块内部组成了一棵树。

    接下来考虑在这些连通块之间连边,为了满足连通块内部任意两个点之间只有唯一简单路径的限制,每个连通块最多只能有一个点与其他连通块有连边,可以称为代表点。代表点之间可以任意连边,如果没有 \(w_i=1\) 的限制,那么只需要边数能够取到即可,设有 \(k\) 个连通块,则可选的边数区间为 \([n-1,n-k+\frac{k(k-1)}{2}]\)

    对于 \(w_i=1\) 的限制,如果 \(u_i,v_i\) 在同一个连通块中一定无解。否则,若只有两个连通块,那么仅用代表点不可能完成构造。如果有三个以上的连通块,将代表点直接连成一个环,就可以使得任意不在同一连通块的两点之间有超过一条简单路径了,在此基础上可以任意增加边,只需要边数在 \([n,n-k+\frac{k(k-1)}{2}]\) 范围内即可。

    AGC038E - Gachapon

    有一个随机生成器,能生成 \([1,n]\) 之间的整数,其中生成 \(i\) 的概率为 \(\frac{a_i}{S}\)\(S=\sum_{i=1}^{n}a_i\)

    现在这个生成器不断生成数,直到 \(\forall i\)\(i\) 出现了不小于 \(b_i\) 次时停止生成,问期望下此时生成随机数的次数为多少。

    \(a_i,b_i\ge 1,\sum a_i,\sum b_i,n\le 400\)

    view solution

    考虑定义 \(w_i\) 表示期望下生成多少次随机数才能使得 \(i\) 出现了不少于 \(b_i\) 次,那么所求即为 \(\max\{w_1,w_2,\dots w_n\}\)

    可以想到 \(\min-\max\) 容斥,将 \(\max(S)\) 视为 \(S\) 集合中所有数的 \(w\) 的最大值,那么有 \(\max(S)=\sum_{T\subset S}(-1)^{|T|-1}\min(T)\)

    现在考虑如何求解 \(\min(T)\),首先 \(T\) 之外的数可以忽略,由于每次随机有 \(\frac{\sum_{i\in T}a_i}{S}\) 的概率随机到 \(T\) 中的数,因此可以认为只在 \(T\) 中的数随机,最后答案乘上 \(\frac{S}{\sum_{i\in T}a_i}\) 即可。

    现在的问题相当于每次生成器在 \(T\) 中的数随机,当某一个数 \(i\) 出现了不小于 \(b_i\) 次时停止,询问此时生成随机数的次数的期望。可以套路地将其转化为 \(\sum_{k=0} f_k\) ,其中 \(f_k\) 为执行 \(k\) 次随机后游戏没有结束的概率,可以发现 \(f_k\) 相当于将 \(k\) 个不同的球分配到 \(|T|\) 个盒子中,满足第 \(i\) 个盒子的球数 \(<b_i\)。可以先转化为相同的球,再进行背包 \(dp\),最后乘上多重组合数以及概率 \(\dfrac{\prod_{i} a_i^{d_i}}{(\sum_i a_i)^k}\dfrac{k!}{\sum_i (d_i)!}\),其中 \(d_i\) 为第 \(i\) 个盒子的球数,可以在 \(dp\) 过程中计算。

    于是可以将最外层对 \(T\) 的暴力枚举也加入 \(dp\) 中,记 \(f_{i,j,k}\) 表示考虑了前 \(i\) 个数,目前 的 \(T\) 集合中 \(\sum_{x\in T}a_x=j,\sum_{x\in T}b_x=k\) 时的方案系数之和,则有转移:

    \[f_{i,j,k}=f_{i-1,j,k}-\sum_{w=0}^{b_i-1}\frac{f_{i-1,j-a_i,k-w}(a_i)^w}{w!} \]

    其中的 \(-1\) 是因为 \(\min-\max\) 容斥的 \((-1)^{|T|-1}\) 系数,因此初始值 \(f_{0,0,0}=-1\)。最终答案即为

    \[\sum_{j}\sum kf_{n,j,k}\frac{S}{j}\frac{k!}{j^k} \]

    最终的复杂度是 \(\mathcal O((\sum_ib_i)^2\sum_i a_i)\) 的。

    AGC038F - Two Permutations

    给定两个 \(0\sim n-1\) 的排列 \(\{p_0,p_1,\dots,p_{n-1}\},\{q_0,q_1,\dots,q_{n-1}\}\),要求构造两个 \(0\sim n-1\) 的排列 \(\{A_i\},\{B_i\}\),满足 \(A_i=i\) 或者 \(A_i=p_i\) ,以及 \(B_i=i\) 或者 \(B_i=q_i\)。在此基础上最大化 \(A_i\not=B_i\)\(i\) 数量。询问这个最大值。

    view solution

    考虑求排列 \(p\) 分解为若干个环。对于某一个环,不妨设其上的元素为 \((1,2,\dots ,k)\),可以发现该环对应的 \(A\) 取值只有两种情况:

    • \(A_1=1\),那么 \(A_k\) 就只能选择 \(k\) 了,依次类推可得到对于 \(\forall i\in[1,k]\) 都有 \(A_i=i\)
    • \(A_1=p_1=2\),那么 \(A_2\) 就只能选择 \(p_2=3\) 了,以此类推推可以得到对于 \(\forall i\in[1,k]\) 都有 \(A_i=p_i\)

    同理可以将 \(q\) 拆为若干环得到类似的结论。

    现在问题相当于对每个环指定是拆成若干自环还是保留原状。考虑如何满足 \(A_i\not=B_i\) 的限制,这一点需要进行分类讨论,不妨设 \(p_i,q_i\) 所在的环分别为 \(C,D\)

    • \(p_i=q_i=i\),那么必然有 \(A_i=B_i\),可以忽略。
    • \(p_i=i,q_i\not= i\),那么若环 \(D\) 被拆则 \(A_i=B_i\),否则 \(A_i\not=B_i\)
    • \(p_i\not= i,q_i= i\),那么若环 \(C\) 被拆则 \(A_i=B_i\),否则 \(A_i\not=B_i\)
    • \(p_i\not= i,q_i\not=i,p_i=q_i\),那么若环 \(C,D\) 同时被拆或者同时保留则 \(A_i=B_i\),否则 \(A_i\not=B_i\)
    • \(p_i\not= i,q_i\not=i,p_i\not=q_i\),那么只有两个环都被拆时才有 \(A_i=B_i\)

    于是可以建立一个最小割模型,初始令所有 \(A_i\not= B_i\),每断掉一条边相当于令 \(A_i=B_i\)。对 \(p,q\) 的环分别建边,将 \(p\) 中的环与源点相连,\(q\) 中的点与汇点相连可以看作是保留这个环,否则是拆掉这个环。

    上述五种情况分别对应:

    • 不连边,直接令答案 \(-1\)
    • 连边 \((D,t,1)\)
    • 连边 \((S,C,1)\)
    • 连边 \((C,D,1),(D,C,1)\)
    • 连边 \((D,C,1)\)

    最后跑网络流即可,由于这是一个流量为 \(1\) 的二分图,复杂度是 \(\mathcal O(n\sqrt{n})\) 的。

    AGC039

    AGC039D - Incenters

    在平面中给定\(n\)个位于单位圆上的点,坐标形如\((\cos\frac{2\pi T_i}{L},\sin\frac{2\pi T_i}{L})\),等概率随机地选取其中不同的三个点组成三角形,求三角形的内心(即,内切圆的圆心)的横纵坐标期望。

    \(n\le 3000\)

    view solution

    没有几何知识,甘拜下风。

    核心理论一:将该三角形 \(ABC\) 的三条角平分线作出并延长,交单位圆于 \(D,E,F\) 三点,则三角形 \(ABC\) 的内心为三角形 \(DEF\) 的垂心。证明考虑圆周角。

    核心理论二(欧拉线):对于任意三角形 \(ABC\),其外心 \(O\),重心 \(G\),垂心 \(H\) 在同一直线上且 \(|GH|=2|OG|\)

    于是现在我们只需要求所有这样的三角形 \(DEF\) 的外心坐标和与重心坐标和了。前者显然是 \(0\),而对后者注意到重心的横纵坐标均为三个顶点的坐标和的 \(\frac{1}{3}\),于是可以枚举点 \(A,B\),用它们的弧中点的坐标来更新答案,即可做到 \(\mathcal O(n^2)\)

    AGC039E - Pairing Points

    在一个圆上有 \(2n\) 个点,其中一些点对有连线,且保证不存在三线共点。现在要求选择 \(n\) 条线保留下来使得每个点恰好连一条线,并且将这 \(n\) 条线画出来后构成一棵树。

    \(n\le 20\)

    view solution

    首先令 \(n\gets 2n\)。考虑枚举 \(1\) 号点与哪个点相连,不妨假设为 \(i\) 号点,然后就能将环划分为两部分,两部分之间至少要有一条边相连,连了这条边之后就只需要两边内部连通,整个图就连通了。

    于是可以 \(dp\),记 \(f_{l,k,r}\) 表示仅考虑区间 \([l,r]\) 中的点,其中的点 \(k\) 向区间外部连了一条边,内部连边使得区间 \([l,r]\) 连通的方案数。

    那么 \(k\) 连出的这条边将区间划分为 \([l,k-1]\)\([k+1,r]\) 两部分,两部分之间可能连了若干条边 \((a_1,b_1),(a_2,b_2),\dots,(a_t,b_t)\),不妨假设 \(a_1< a_2< \dots <a_t\),那么为了不形成环必然也有 \(b_1<b_2<\dots<b_t\)。考虑枚举 \(x=a_1,y=a_1\)。那么此时 \((x,k)\) 中的点连出的边,为了不形成环,一定会存在一个分界点 \(p\) 满足 \(p\) 之前(包括 \(p\))的点连出的边都与边 \((x,y)\) 相连,\(p\) 之后的点都与 \(k\) 连出的边相连。同理在 \((k,y)\) 中也有一个分界点 \(q\)。因此就得到了 \([l,p],[p+1,q-1],[q,r]\) 两个子问题。

    故有转移 \(f_{l,k,r}\gets f_{l,x,p}+f_{p+1,k,q-1}+f_{q,y,r}(a_{x,y}=1)\)

    其中 \(a_{i,j}\) 表示点 \(i,j\) 是否有边。直接暴力枚举 \(l,k,r,x,y,p,q\)\(\mathcal O(n^7)\) 的,但由于有 \(\frac{1}{7!}\) 的常数已经可以通过了,但也可以继续优化。

    假设正在转移 \([l,r]\),可以发现 \(x\) 仅在 \(f_{l,x,p}\) 以及 \(a_{x,y}=1\) 处出现,可以先枚举 \(p,y\),求出 \(mx1_{p,y}=\max_x([a_{x,y}=1]f_{l,x,p})\)。接下来枚举 \(p,q\) 求出 \(mx2_{p,q}=\max_{y}(mx1_{p,y}+f_{q,y,r})\)。最后再枚举 \(p,k\) ,有转移 \(f_{l,k,r}\gets \max_{q}(mx2_{p,q}+f_{p+1,k,q-1})\)。这样一来复杂度就优化到 \(\mathcal O(n^5)\) 了,还有 \(\frac{1}{120}\) 的常数。

    AGC039F - Min Product Sum

    一个大小为 \(n\times m\) 的矩阵,矩阵中每个数在 \([1,k]\) 中任意取值。对于某一个矩阵,定义 \(f(x,y)\) 表示第 \(x\) 行与第 \(y\) 列的所有数的最小值,然后定义该矩阵的权值为 \(\prod_{i=1}^{n}\prod_{j=1}^{m}f(i,j)\)。为所有 \(k^{nm}\) 种矩阵的权值之和。

    \(n,m,k\le 100\)。时限 \(6s\)

    view solution

    貌似是非常套路的题目?

    直接最小值不好处理,可以想到将 \(f(x,y)\) 改为 \(\sum_{i=1}^{k}[f(x,y)\ge i]\)

    于是有:

    \[\begin{aligned} ans&=\prod_{x=1}^{n}\prod_{y=1}^{m}\sum_{i=1}^{k}[f(x,y)\ge i]\\ &=\sum_{a_{x,y}}\prod_{x=1}^{n}\prod_{y=1}^{m}[f(x,y)\ge a_{x,y}]\\ &=\sum_{a_{x,y}}\prod_{x=1}^{n}\prod_{y=1}^{m}(k-\max_i\{a_{x,i},a_{i,y}\}+1) \end{aligned} \]

    考虑记 \(r_x=\max_{i}a_{x,i},c_y=\max_{i}a_{i,y}\),改为枚举 \(r,c\)

    \[ans=\sum_{\{r_n\},\{c_m\}}\prod_{x=1}^{n}\prod_{y=1}^{m}(k-\max(r_x,c_y)+1)g(r,c) \]

    其中 \(g(r,c)\) 表示填写矩阵 \(a\) 使得,\(\forall x\in[1,n],y\in[1,m],\max_{i}a_{x,i}=r_x,\max_ia_{i,y}=c_y\) 的方案数。求解 \(g\) 可以先将所有 \(a_{x,y}\)\([1,\min(r_x,c_y)]\) 范围内随便填,这样可能实际的 \(r,c\) 偏小,这可以通过容斥钦定哪些 \(r,c\) 偏小,然后强制要求这一行/这一列的 \(a\)\(<r/c\) 来解决。容斥后最终的贡献柿子形如 \(\prod_{x=1}^{n}\prod_{y=1}^{m}\min(r_x,c_y)\)

    注意到贡献全是两个数的 \(\max\) 或者 \(\min\),于是可以将 \((k-\max(r_x,c_y)+1)\) 的贡献在较大值处计算,\(\min(r_x,c_y)\) 的贡献在较小值出计算,设 \(f_{i,x,y}\) 表示已经将 \(\le i\)\(r,c\) 都填写了,且已经填写了 \(x\)\(r\)\(y\)\(c\) 的总贡献。新建一个 \(r\) 时,就对已经填写的所有 \(c\) 计算 \((k-r+1)^y\) 的贡献,对还未填写的所有 \(c\) 计算 \(\min(r_x,c_y)\) 的贡献。

    但注意到最后还要将 \(r,c\) 进行分配,因此要乘上 \(\frac{n!m!}{\prod_{i=1}^{k}(x_i)!(y_i)!}\) 的贡献,于是需要再 \(dp\) 中再开两维分别表示已选择的数中 \(r=i\) 的有 \(x\) 个,\(c=j\) 的有 \(y\) 个,每次增加一个 \(r=i\) 的或者 \(c=j\) 的进行转移,这样一来会出现重复计算,同一种方案会被计算 \(\prod_{i=1}^{k}\binom{x_i+y_i}{x_i}\) 次。实际上的答案要乘上 \(\frac{n!m!}{\prod_{i=1}^{k}(x_i)!(y_i)!}\prod_{i=1}^{k}\binom{x_i+y_i}{x_i}=\frac{n!m!}{\prod_{i=1}^{k}(x_i+y_i)!}\),可以发现抵消后我们只用关心 \(x+y\) 是多少,就可以将状态数优化到 \(\mathcal O(n^4)\) 了,最终复杂度也为 \(\mathcal O(n^4)\)

    AGC040

    AGC040D - Balance Beam

    给定 \(n\) 条长度为 \(1\) 的边,A 通过第 \(i\) 条边的速度为 \(\dfrac{1}{a_i}\),B 通过第 \(i\) 条边的速度为 \(\dfrac{1}{b_i}\)

    现在 A 可以对着 \(n\) 条边进行排序组成一条链,然后 A 从左端点出发,B 在链上随机一个实数点出发向右走,问 A 能追上 B 的概率最大是多少。\(n\le 10^5\)

    view solution

    对于这种位移固定的行程问题,考虑作出时间-位移图象(时间是纵坐标),那么 A 和 B 的行进路线就是从 \((0,0)\) 出发,分别到 \((n,\sum a_i)\)\((n,\sum b_i)\) 的两条折线。

    接下来将 B 的图象向下平移直到再平移就不与 A 图象相交为止。若此时 B 图象与 \(x\) 轴交点为 \((p,0)\),那么答案就是 \(\dfrac{p}{n}\)。问题转化为如何最大化 \(p\)。考虑从 \((p,0)\) 出发,先沿 B 图象走,走到与 A 的交点时就改为走 A 图象,最终走到 \((n,\sum a_i)\)。于是最大化 \(p\) 相当于要最大化从 \((p,0)\)\((n,\sum a_i)\) 的平均斜率。

    枚举 \(p\) 所在的边 \(x\),那么如果将边 \(i\) 放在 \(x\) 后面,它至多贡献 \(\max(a_i,b_i)\) 的斜率。于是将所有边按 \(\max(a_i,b_i)\) 排序,选择一个后缀放在 \(x\) 后,可以发现一定可以通过将它们按 \(a_i-b_i\) 排序使得贡献全部取到 \(\max(a_i,b_i)\)。于是可以通过二分找到最小的后缀满足 \(\sum \max(a_i,b_i)>\sum a_i-b_x\)。然后就可以算出 \(p\) 的大小更新答案了。复杂度为 \(\mathcal O(n\log n)\)

    AGC040E - Prefix Suffix Addition

    有一个长为 \(n\) 的序列 \(a_1,a_2,\dots,a_n\)。初始所有 \(a_i\) 都为 \(0\),可以进行以下两种操作:

    • 选定整数 \(k(1\le k\le n)\) 与不下降非负序列 \(c_1,c_2,\dots,c_k\),对所有 \(1\le i \le k\),令 \(a_i\) 加上 \(c_i\)
    • 选定整数 \(k(1\le k\le n)\) 与不上升非负序列 \(c_1,c_2,\dots,c_k\),对所有 \(1\le i \le k\),令 \(x_{N-k+i}\) 加上 \(c_i\)

    问最少进行多少次操作使得最后对任意 \(i\)\(x_i=A_i\)\(n\le 2\times 10^5,A_i\le 10^9\)

    view solution

    首先前后缀操作显然可以转化为对原序列任意一个区间,增加一个不下降序列或不上升序列。

    另一个重要结论是:存在一种最优方案使得同一种操作的所有区间互不相交。证明考虑调整法,对于相交的两个区间,直接将相交的部分叠加到某一个操作上即可。

    于是可以对位置 \(i\)\(b_i\) 表示操作 1 对位置 \(i\) 的贡献,\(c_i\) 表示操作 2 对位置 \(i\) 的贡献。如果 \(b_i,c_i\) 已经确定,那么接下来就只需要将 \(b_i\) 拆分成若干个不下降子序列,\(c_i\) 拆分成若干个不上升子序列,于是操作数 \(=\sum_{i=1}^{n}[b_i>b_{i+1}]+[c_i<c_{i+1}]\)

    对于这一问题就可以设 \(dp\) 状态 \(f_{i,j}\) 表示考虑了前 \(i\) 个位置,\(b_i=j\) 时的最小操作数,有:

    \[f_{i,j}=\min_{k}f_{i-1,k}+[k>j]+[a_{i-1}-k<a_{i}-j]\\ =\min_{k}f_{i-1,k}+[k>j]+[k>a_{i-1}-a_{i}+j] \]

    因此 \(f_{i,j}\) 是随着 \(j\) 的增加单调不增的并且 \(f_{i,0}\le f_{i,a_i}+2\)。因此我们只需要维护 \(f_{i,j}=f_{i,a_i}+2,f_{i,a_i}+1,f_{i,a_i}\) 的三个 \(j\) 的区间即可。

    AGC040F - Two Pieces

    AGC041

    AGC041E - Balancing Network

    一个平衡网络由 \(n\) 根导线与 \(m\) 个平衡器组成。从左到右第 \(i\) 个平衡器连接导线 \(x_i\)\(y_i\),可以指定方向为上/下。当一个令牌从第 \(i\) 根导线进入时,从左到右遍历每一个平衡器,如果该平衡器方向为下且令牌在导线 \(x_i\) 上,令牌转移到 \(y_i\);如果该平衡器方向为上且令牌在导线 \(y_i\) 上,令牌转移到 \(x_i\);否则令牌不移动。

    如果一组给平衡器定向的方案,能使得无论令牌从哪根导线进入,最终都会停留在同一根导线上,则称这组方案是均匀的,否则称为不均匀的。要求构造一组均匀的方案以及一组不均匀的方案,或判断无解。

    \(n\le 50000,m\le 100000\)

    view solution

    均匀方案:

    枚举最终走到的导线 \(x\),从右到左加入每一个平衡器,记录 \(pd_i\) 表示仅考虑当前的平衡器时从 \(i\) 出发能否到达 \(x\)。那么对于平衡器 \((a,b)\) ,如果 \(pd_a,pd_b\)\(=0\) 或都 \(=1\) 就随便定,否则就从 \(=0\) 的指向等于 \(1\) 的,然后就可以将 \(pd_a,pd_b\) 都赋值为二者的或了。最后看是否所有 \(pd_i\) 都等于 \(1\) 即可。

    直接实现是 \(\mathcal O(n^2)\) 的,由于只有或操作可以用 \(bitset\) 同时维护最终导线为 \(1\sim n\) 时的 \(pd\) 优化到 \(\mathcal O(\frac{n^2}{\omega})\)

    不均匀方案:

    由于 \(m>0\)\(n=2\) 一定无解,可以构造证明 \(n>2\) 一定有解:

    还是从右到左加入平衡器,记录 \(to_i\) 表示当前从 \(i\) 出发能走到的导线,\(siz_i\) 表示最终到达的导线为 \(i\) 的有多少个。对于平衡器 \((a,b)\),如果 \(to_a=to_b\) 那么随便定没有任何影响;否则注意到定向为 \(a\rightarrow b\) 相当于让 \(siz_{to_a}--,siz_{to_b}++\),于是我们去 \(siz_{to_a}\)\(siz_{to_b}\) 中较小的一个 \(+1\) 即可,由于 \(siz_{to_a}+siz_{to_b}\le n\)\(n>2\),因此它们的较小值一定 \(<n-1\),如此操作不会有任何一个 \(siz\)\(=n\)

    AGC041F - Histogram Rooks

    一个 \(n\)\(n\) 列的正方向棋盘,但第 \(i\) 列只有最下方的 \(h_i\) 个格子有效。可以在任何一个有效格子上放置车使得所有与该车在同一行/同一列并且与其之间的格子全都有效的格子被覆盖。问有多少种放置车的方案使得所有有效格子都被覆盖。对 \(998244353\) 取模,\(n\le 400\)

    view solution

    对于“所有都”的问题,不难想到直接容斥,即钦定哪些格子没有被覆盖,此时就会有一些位置被钦定不能放置车,贡献即为 \(2\) 的其余位置数量次方乘上容斥系数 \((-1)^{|S|}\)

    但直接枚举复杂度很高且不好 \(dp\)。注意到如果一个格子被钦定了,它所在的列都不能放置车。于是考虑先枚举列的集合 \(S\) 表示 \(S\) 中的列有格子被钦定了,然后再对每一个行连续段分别考虑,此时就只用管对行的限制了。

    对于每一个行连续段,不妨设其大小为 \(sz\),有 \(p\) 个格子在被钦定的列中,那么有两种情况:

    • \(p\) 个格子都没有被钦定,那么其余位置可以随意选择,贡献为 \(2^{len-p}\)
    • \(p\) 个格子中有被钦定的,那么其余位置只能不放车,只有一种方案,但还需要枚举哪些格子被钦定算上容斥系数,因此总贡献为 \(\sum_{i=1}^{p}(-1)^i\binom{p}{i}=-\binom{p}{0}=-[p>0]\)

    但直接这样算还有一个重大问题:可能会有一些被钦定的列最后没有一个格子被钦定。对此的做法是:再加一层容斥,额外枚举 \(T\subset S\) 表示钦定 \(T\) 中列没有任何一个格子被选择,再乘上容斥系数 \((-1)^{|T|}\)

    此时再考虑每个行连续段,第一种情况贡献不变,对于第二种情况,记 \(q\) 表示有 \(q\) 个格子在 \(T\) 中的列里,那么这 \(q\) 个格子无法被选择,贡献为 \(\sum_{i=1}^{p-q}(-1)^i\binom{p-q}{i}=-[p-q>0]=-[p\not=q]\)

    现在可以考虑 \(dp\) 了,但存在一个问题是每个行连续段的 \(p,[p\not=q]\) 并不是独立的,考虑行连续段之间的关系是什么,对于 \(h\) 建立笛卡尔树。每次对当前区间取出其最小值,将区间划分为左右两部分,那么这一个连续段的 \(p\)\(p\not=q\) 就可以有这两个部分的值以及中间一列的决策来得到,于是可以树形 \(dp\),记 \(f_{i,j,0/1}\) 表示当前 考虑 \(i\) 的子树,且 \(i\) 对应的连续段的 \(p\)\(j\),以及 \(p\) 是否等于 \(q\)。树形背包转移即可。

    AGC043

    AGC043D - Merge Triplets

    给定如下构造长为 \(3n\) 的排列 \(P\) 的方法:

    先任意生成一个长为 \(3n\) 的排列 \(A\),然后对于 \(\forall k\in[0,n-1]\),将 \(A_{3k},A_{3k+1},A_{3k+2}\) 分为一组。有 \(n\) 个指针分别指向每一组的第一个数。

    接下来不断取出当前指针指的所有数中最小的一个放在 \(P\) 的最后,然后将对应的指针向右移动一格,移出所在组了就将这一指针删除。

    问最终能生成多少种不同的排列 \(P\)\(n\le 2000\)

    view solution

    考虑判定一个排列是否合法:

    考虑这个排列中数的最大值,显然它必须在这个排列的最后三个位置,否则一定不合法,并且在它之后出现的数一定与它同组。于是可以将它以及它之后的数组成一段,对其余部分离散化后递归处理。最终我们得到了若干长为 \(1,2,3\) 的段,那么原题中的每一组一定由:

    • 长为 \(3\) 的段。
    • 一个长为 \(1\) 的段与一个长为 \(2\) 的段。
    • 三个长为 \(1\) 的段。

    注意到这些组合对所选择的段没有任何的要求,因此只要满足 \(1\) 的数量 \(\ge\) \(2\) 的数量就一定可以得到一组合法的 \(A\)

    于是最终的判定相当于取出 \(P\) 中的所有前缀 \(\max\),将 \(P\) 分为了若干段,满足每段长度都不超过 \(3\)\(1\) 的数量 \(\ge 2\) 的数量则可以被构造出来。设 \(dp\) 状态 \(f_{i,j}\) 表示考虑了 \(P\) 中的前 \(i\) 个数,\(i\) 是某一段的末尾,且当前 \(1\) 的数量减 \(2\) 的数量 \(=j\) 时的方案数。即可 \(\mathcal O(n^2)\) 完成转移。

    AGC043E - Topology

    给定 \(n\),对于全集 \(U=\{0,1,\dots,n-1\}\),对于 \(U\) 的每个子集 \(S\),记 \(B_S\) 为点集 \(\{(i+0.5,0.5)|i\in S\}\),给定 \(A_S\) 。要求构造一条闭合曲线使得对于所有 \(A_S=1\)\(S\),满足存在一种方法将该折线在不触碰 \(B_S\) 的条件下移动到 \(x\) 坐标以下,对于 \(A_S=0\)\(S\) 则不存在,或者判断无解。

    \(n\le 8\),要求最终曲线长度不超过 \(250000\)

    view solution

    可以发现 \(A_S\) 应当存在传递性,即如果 \(A_S=0\),那么对于 \(\forall S\subset T\) 都有 \(A_T=0\),同时如果 \(A_S=1\),那么对于 \(\forall T\subset S\) 都有 \(A_T=1\)。判定完这一条之后现在我们只用考虑所有极小的满足 \(A_S=0\) 的子集 \(S\) 即可。

    考虑对每一个 \(S\) 构造一条从 \((0,0)\) 出发到 \((0,0)\) 结束的曲线,满足它会被集合 \(S\) 挡住,但去掉 \(S\) 中的任何一个点它都能成功移动,并且 \(S\) 之外的点对它没有任何影响,然后将所有曲线拼起来即可。

    考虑对于某一个 \(S\) 以及闭合曲线如何判定是否能够成功移动。从这条曲线的任何一个位置开始沿任何一个方向移动,如果经过了 \((i+\frac{1}{2},1)\) 就写下 \(u_i\),经过 \((i+\frac{1}{2},0)\) 就写下 \(d_i\)。最终写出的序列中如果相邻的两个字符相同,可以直接将这一段拉走,即将这两个字符消去。于是只要可以通过每次消去相邻且相同两个字符可以将这一序列删空,则 \(A_S=1\)

    想出这个判定后,就不难给出构造了:

    递归构造,对于当前集合 \(S\),如果 \(|S|=1\) ,直接绕这个点一圈构造 \(u_id_i\) 即可。否则,取 \(S\) 中最小的数 \(i\),先构造 \(S/i\) 的方案 \(T\),先穿过 \(i\) 的上方,按 \(T\) 走完之后的点,再从 \(i\) 上方走回来;然后再穿过 \(i\) 的下方,按 \(T^{-1}\)(将 \(T\) 翻转得到的结果)走完之后的点,再从 \(i\) 下方走回来。最终得到 \(u_iTu_id_iT^{-1}d_i\),可以发现它没有任何两个相邻字符相同,一定非法,但删去任何一个点之后它都合法。

    最终长度限制还是比较宽裕的。

    AGC043F - Jewelry Box

    AGC024

    AGC024E - Sequence Growing Hard

    给定 \(n,k,m\) ,问有多少个序列组 \((A_0,A_1,\dots,A_n)\) 满足以下条件:

    • \(A_i\) 序列元素个数为 \(i\)
    • 所有序列的元素都在 \([1,k]\) 内。
    • \(A_i\)\(A_{i+1}\) 的子序列
    • \(A_i\) 字典序小于 \(A_{i+1}\)

    答案对 \(m\) 取模。\(n,k\le 300,m\le 10^9\)

    view solution

    核心转化:

    • 加元素难以处理,可以反过来考虑删元素。
    • 对序列进行操作的问题,遇到限制条件 \(a_i>a_{i+1}\)\(a_i<a_{i+1}\),可以考虑枚举最小数/最大数的位置。

    对于原问题,可以发现从 \(A_i\)\(A_{i+1}\) 相当于在 \(A_i\) 中加一个元素,字典序的限制则要求如果这个元素被放在 \(c_i\) 前方,则必须 \(\ge c_i\)。如果 \(=c_i\),那么得到的序列和放到 \(c_i\) 之后是一样的,因此我们可以假设加入的元素必须 \(>c_i\)

    但这个问题还是很难处理,考虑将问题倒过来,转化为初始有一个序列 \(A_n\),每一步可以选择 \(A_n\) 中的一个元素 \(s_i\) 删去,但必须满足 \(s_i>s_{i+1}\)

    对于这个限制条件,可以想到枚举 \(A_n\) 序列中的最小数的第一次出现的位置,设为 \(p\),那么 \([p+1,n]\) 区间中的元素都必须在 \(s_p\) 之前被删去,那么 \([p+1,n]\) 区间与 \([1,p-1]\) 区间就会一直被 \(s_p\) 隔开而不会互相产生影响,可以划分出两个子问题,当然还有一个额外的限制就是区间中的元素必须 \(\ge s_p\) 或者 \(>s_p\),于是考虑状态 \(dp_{i,j}\) 表示长为 \(i\) 的序列在元素必须 \(\ge j\) 的情况,有多少种删法。转移时枚举最小数以及其第一次出现的位置,有:

    \[dp_{i,j}=\sum_{p=1}^{i}\sum_{k=j}^{m}dp_{p-1,k+1}dp_{n-p,k}\binom{n}{n-p} \]

    后面乘的组合数是分配这 \(n\) 个元素的删除顺序。直接转移复杂度为 \(\mathcal O(n^2m^2)\),但注意到对于同一个 \(p\)\(dp_{i,j}\)\(dp_{i,j+1}\) 的转移相比,只增加了一个 \(\mathcal O(1)\) 计算的 \(dp_{p-1,j+1}dp_{n-p,j}\),因此可以优化到 \(\mathcal O(n^2m)\)

    AGC030

  • 相关阅读:
    PouchDB:一款受CouchDB启发的离线Web数据库
    如何使用JPA注解映射枚举类型
    重新排列参数
    sql不同数据处理方式完成同一处理结果对日志增长的影响
    那些让我念念不忘的 Firefox 扩展
    Linux现可运行于Windows Azure上
    Vector Fabrics推出多核软件优化工具Pareon
    分解公式 sql
    sql树形数据生成xml
    Microsoft .NET终于提供了一个通用的Zip库
  • 原文地址:https://www.cnblogs.com/tqxboomzero/p/16178417.html
Copyright © 2020-2023  润新知