zoukankan      html  css  js  c++  java
  • 刷(shui)题记录 2021.12 [1]

    [ABC228-G] Digits on Grid

    \(\Rightarrow\)原题链接

    可以发现行数和列数相当小,可以将其中一维状压,同时因为奇数步和偶数步的操作很类似,只需要考虑其中一种就行了,这里考虑奇数步。

    \(f(S)\) 表示当前位置所在的行的集合为 \(S\) 的方案数,接下来我们需要计算出 \(g(S)\) ,其意义是所在的列的集合为 \(S\) 的方案数,这时候我们从 \(f(S)\) 中找一个数字 \(a\) 拓展,其能到达的行的集合为 \(D(S,a)\) ,那么可以得到转移:

    \[g(D(S,a))\leftarrow f(S) \]

    这个 \(D(S,a)\) 可以使用 \(D(S,a)=\{j\mid i\in S, a_{i,j}=a\}\) 得到。

    初始条件显然是 \(f(\{1,2,3,\dots, h\}) = 1\)

    [ABC229-G] Longest Y

    \(\Rightarrow\)原题链接

    容易想到二分,然后 \(\verb|check|\) 的时候显然要选择编号连续的一段,保持中间的不动,然后两头往中间靠就行了。

    [ABC230-G] GCD Permutation

    \(\Rightarrow\)原题链接

    可以先写一下题目要求的式子:

    \[\mathrm{ANS}= \sum_{i=1}^n \sum_{j=i}^n \left[(i,j)> 1 \land \left(p_i,p_j\right)> 1\right] \]

    对于形如 \([n>1]\) 的判断式,可以使用莫比乌斯函数的性质:\(\sum_{d|n} \tilde\mu(d)=[n>1]\) 展开。注意,这个 \(\tilde\mu(n)=-\mu(n)\) 。由于原题的条件式是 \(\verb|and|\) ,因此可以直接将两个求和乘起来。

    变化一下:

    \[\mathrm{ANS}= \sum_{i=1}^n \sum_{j=i}^n \sum_{d|(i,j)} \sum_{g|\left(p_i,p_j\right)} \tilde\mu(d) \tilde\mu(g) \]

    按照化式子的套路,可以将 \(d,g\) 放到前面去:

    \[\mathrm{ANS}= \sum_{d=1}^n \sum_{g=1}^n \tilde\mu(d) \tilde\mu(g) \sum_{i=1}^n \sum_{j=i}^n [d|i~\land~d|j~\land~g|p_i~\land~g|p_j] \]

    后面两个 \(\Sigma\) 可以看成是一个关于 \(d,g\) 的函数,但是因为 \(d,g\)\(i,j\) 的限制其实是一样的,因此设 \(f(d,g)=\sum_{i=1}^n [d|i~\land~g|p_i]\) ,那么式子就变成了:

    \[\mathrm{ANS}=\sum_{d=1}^n \sum_{g=1}^n \tilde\mu(d) \tilde\mu(g) \frac{f(d,g)[f(d,g)+1]}{2} \]

    \(\tilde\mu(n)\ne 0\) 位置不多,将这些位置都找出来。

    [ABC225-F] String Cards

    \(\Rightarrow\)原题链接

    写了一堆假做法。

    首先将字符串排序,使其满足对于任意一组 \(1\leq i < j\leq N\) ,满足 \(S_i+S_j< S_j+S_i\) 。然后倒着 \(dp\) ,设 \(f(i,j)\) 表示考虑了第 \(i\)\(n\) 个,选择了 \(j\) 个的最小字符串,显然有转移:

    \[f(i,j)=\min\{f(i+1,j),S_i + f(i+1,j-1)\} \]

    [ABC225-G] X

    \(\Rightarrow\)原题链接

    首先可以转化一下题意:\(\mathrm{ANS}=\left(\sum_{i,j} A_{i,j}\right)-\text{不选择的位置}-C\times 横线数\) 。我们要最小化这两个减去的数,可以考虑用最小割。

    有两种选择:

    1. 不选择这个数。
    2. 选择这个数,尝试和左上角和右上角连接起来,对于其中一个方向,如果不能连接,就加上 \(C\)

    对于第一种选择,可以这样搞:

    \[\forall ~1\leq i\leq H, 1\leq j\leq W,~S\xrightarrow{A_{i,j}} (i,j) \]

    对于第二种,以左上为例:

    \[\begin{aligned} \forall~ 1\leq j\leq W, ~&(1,i)\xrightarrow{C} T\\ \forall~ 1<i\leq H, 1\leq j\leq W, ~&(i,j)\xrightarrow{0} T, (i,j)\xrightarrow{C} (i-1,j-1) \end{aligned} \]

    [USACO21OPEN] Balanced Subsets P

    \(\Rightarrow\)原题链接

    容易想到一个 \(O(n^5)\)\(\verb|dp|\) 。设 \(f(i,l,r,0/1, 0/1)\) 表示当前考虑到第 \(i\) 行,第 \(i\) 行选择了区间 \([l,r]\) ,第 \(i\) 行的左端点为递减/递增状态,右端点为递增/递减状态的方案数,转移显然。可以发现可以用二维前缀和优化成 \(O(n^3)\) 。代码非常令人烦躁。

    [CF-1366F] Jog Around The Graph

    \(\Rightarrow \rm luogu\) 链接

    分情况讨论。

    对于路径长度小于等于 \(m\) 的,可以使用 \(\verb|dp|\) 求出答案:设 \(f(i,j)\) 表示走了 \(i\) 步,到达节点 \(j\) 的最长长度,转移显然,这里令不能到达的 \(f(i,j)=-\infty\)

    对于路径长度大于等于 \(m\) 的答案,设长度为 \(l\),这时候路径一定不是简单路径。思考一下性质可以发现,答案的方案一定是走到某一边的一端之后,剩余都是在这条边上来回走动,换而言之,答案一定是形如 \(w_e(l-m)+f(m,u_e/v_e)\) 的。这个东西很明显是一个直线的形式,但是由于坐标范围过大,不能用李超树。将其转化为维护凸包的一半,然后对于凸包上的每一个点都求出贡献。

    [CF-1366G] Construct the String

    \(\Rightarrow \rm luogu\) 链接

    容易想到用 \(\verb|dp|\) 解决,设 \(f(i,j)\) 表示用 \(s_{1\dots i}\) 匹配 \(t_{1\dots j}\) 的最小花费。关键在转移,容易想到删除和匹配一个字符的转移,但是原串中的 \(\verb|'.'|\) 带来的撤回操作并不是那么好处理。但是我们可以将撤回操作和被撤回字符一起处理。具体而言,对于一个位置 \(i\) ,若下一个位置是一个小写字符,其被撤回的操作显然是满足 \(\sum_{j=i}^k |s_j = \verb|'.'||=\sum_{j=i}^k \left|s_j \in [\verb|'a'|, \verb|'z'|]\right|\) 的第一个 \(k\) ,设其为 \(\mathrm{nxt}_i\)

    那么可以得到转移:

    \[\begin{aligned} f(i+1,j+1) &\xleftarrow{s_{i+1}=t_{j+1}} f(i,j)\\ f(i+1,j) &\xleftarrow{} f(i,j)+1\\ f(\mathrm{nxt}_{i+1}, j) &\xleftarrow{ s_{i+1} \in [\verb|'a'|, \verb|'z'|]} f(i,j) \end{aligned} \]

    答案显然为 \(f(|s|,|t|)\)

  • 相关阅读:
    JS打印代码示例
    javascript图片360°旋转
    动态载入/删除/更新外部 JavaScript/Css 文件
    AviSynth入门与应用指南
    汇编64讲(搞免杀、破解必看)在线观看
    C#模拟登录总结
    同时使用apache和IIS,共用80端口的一个解决方案
    Dos命令集合
    批处理for命令详解
    JavaScript定义类的几种方式
  • 原文地址:https://www.cnblogs.com/juruohjr/p/15699579.html
Copyright © 2011-2022 走看看