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|)\)

  • 相关阅读:
    共享纸巾更换主板代码分析 共享纸巾主板更换后的对接代码
    Python Django Ajax 传递列表数据
    Python Django migrate 报错解决办法
    Python 创建字典的多种方式
    Python 两个list合并成一个字典
    Python 正则 re.sub替换
    python Django Ajax基础
    Python Django 获取表单数据的三种方式
    python Django html 模板循环条件
    Python Django ORM 字段类型、参数、外键操作
  • 原文地址:https://www.cnblogs.com/juruohjr/p/15699579.html
Copyright © 2011-2022 走看看