杂题20200304

PA2019Łamana 2 (lam)

给出⼀个字符串 \(s\) ,由前 \(16\) 个⼩写字⺟组成。你现在可以把每个小写字⺟替换成 \(\uparrow\) 或者 \(\rightarrow\) 。然后从 \((0,\ 0)\) 出发,遍历字符串,遇到 \(\uparrow\) 向上⾛⼀步,遇到 \(\rightarrow\) 向右⾛⼀步。求出折线下方覆盖面积的最大值

\(|s|\leq3\times 10^5\)

考虑每一对字母 \((p,\ q)\)\(p\) 替换为 \(\uparrow\) 时对 \(q\) 替换为 \(\rightarrow\) 的贡献是独立的,因此可以在原串中计算所有字母对的贡献,枚举 \(2^{16}\) 种替换方案,并用两两之间贡献计算答案,时间复杂度 \(O(16^2\times(|s|+2^{16}))\)


URAL1544 Classmates 3

给定一张连通无向图,每个点有两种颜色,一次操作可以选择一个点 \(u\) ,将它与它相同颜色连通块中的所有颜色翻转,问最少翻转多少次使得每个点颜色相同

\(n\leq50\)

先将相同颜色连通块合并,得到一张二分图。对于每个点,求出它到所有点的最短路,按距离分层,答案即为到原点最远的点的距离,容易发现只有任意相邻两层之间有边,因此这是最优构造


CF884D Boxes And Balls

\(n\) 个盒子与 \(n\) 种颜色的球,第 \(i\) 种颜色的球个数为 \(a_i\)

初始时所有球都在 \(1\) 号盒,每次操作你可以取出该盒子所有球,将这些球分为 \(2\)\(3\) 组,将每组放到一个空盒子中,操作代价为该盒子操作前球数。问将第 \(i\) 种颜色的球放到第 \(i\) 个盒子,最少的代价。

\(n\leq2\times10^5\)

倒着考虑拆分的过程,容易发现这是能一次合并 \(2\)\(3\) 堆的合并果子。当 \(n\) 为奇数时,显然不断合并最小的三个,直到只剩一个时,为最优答案;否则,增加一个个数为 \(0\) 的球,即可解决 \(n\) 为偶数的情况。


CF884F Anti-Palindromize

给定一个长为 \(n\) 的串 \(s\) ,且 \(n\) 为偶数,每个位置有一个权值 \(b_i\) ,找到 \(s\) 的一个排列 \(t\) ,满足 \(t_i\neq t_{n-i+1}\) ,最大化 \(\displaystyle\sum_{i=1}^nb_i[s_i=t_i]\)

\(n\leq100\)

一种直观的方式是构建网络流,用最大费用最大流,如果没有 \(s_i\neq s_{n-i+1}\) 的限制,能够轻易地表示成匹配的形式,否则可以对每对点 \(i,\ n-i+1\) 建一个小写字母虚点限制流量。

有一种贪心做法。找出所有满足 \(s_i=s_{n-i+1}\) 的数对 \((i,\ n-i+1)\) ;设一共有 \(k\) 对这样的数对,对于每一对,考虑替换其中 \(b\) 较小的那一个,记 \(cnt(x)\) 为有多少个小写字母 \(x\)\(k\) 个数对中是被替换的那一个。

若不存在一个 \(x\) 满足 \(2\times cnt(x)>k\) ,可以通过某种构造分配所有被替换的位置,答案即为 \(b\) 之和减去被替换位置的 \(b\) 之和

否则,一定会与非 pair 位置交换,考虑把多余的 \(x\) 放到外部匹配,由于一定有解,只把 \(x\) 放到外部是可行的,也可以发现这是最优解


CF1117F Crisp String

给一个由前 \(p\) 个小写字母构成的长度为 \(n\) 的字符串 \(s\) ,再给一个 \(p\times p\) 的邻接矩阵 \(G\) (保证\(G_{i,\ j}=G_{j,\ i}\) ),若一个字符串的所有相邻的字符 \(i\)\(j\) 满足 \(G_{i,\ j}=1\) ,那么称这个字符串是“好的”(空串也是好的)。

你每次能够选择一种字符并把当前串内所有这个字符删去,但操作后的字符串必须还是好的。问最终能够得到的字符串的最小长度。

保证一开始的串是好的。

\(n\leq10^5;\ p\leq17\)

考虑一对 \(G_{i,\ j}=0\)\((i,\ j)\) 带来的限制,如果一段区间 \([l,\ r]\) 满足 \(s_l=i,\ s_r=j\) ,且不存在 \(k\) 使得 \(l<k<r,\ s_k=i\)\(j\) ,那么区间 \([l,\ r]\) 中的所有非 \(i,\ j\) 字符不能在 \(i\)\(j\) 被删之前删完

令二进制状态 \(S\) 中第 \(i\) 位为 \(1\) 表示字符 \(i\) 没被删,若 \(T\) 为全集去掉区间 \([l,\ r]\) 中的所有非 \(i,\ j\) 字符,则 \(T\) 的所有 \(i,\ j\) 这两位都为 \(1\) 的子集是非法的。确定了所有非法状态后,能从全集出发,只经过合法状态所能到达的就是可选答案集合,暴力计算即可

对于原串每一位 \(i\) ,将它作为候选区间右端点,枚举左端点,即每种字符上一次出现位置

时间复杂度 \(O(p^3\times(n+2^p))\) ,常数较小


CF1320D Reachable Strings

给定一个 \(01\) 串。每次询问两个等长的子串,询问是否可以从一个经过数次变换变成另一个。变换操作的定义是每次选定一个包含 \(110\) 或者 \(011\) 的子段,让 \(110\to 011\) 或者 \(011\to110\)

\(n,\ q\leq2\times10^5\)

无论怎么操作,只可能挪动长为偶数的 \(1\) 连续段。去掉长为偶数的 \(1\) 连续段后,将每一段长为奇数的 \(1\) 连续段看作一个点,不对 \(0\) 操作,则每个间隔完全匹配的两个字符串能够通过操作变得一致。

构造答案可以考虑,对于每个 \(1\) 连续段,若长为偶数,直接丢到最前面;否则丢 \(len-1\) 个到最前面

判断魔改后的”性质串“是否相同可以 hash

放一份神仙代码之后看看()https://codeforces.com/contest/1320/submission/72172140

posted @ 2020-03-04 20:58  cnJuanzhang  阅读(124)  评论(0编辑  收藏  举报