Solution

赛时切了 ABCDEG,不会 F。

E

考虑使用若干个集合 S i S_i Si​ 维护各个数出现的位置,那么两个操作分别可以被抽象为:

  • 在一个集合中加入一个数。
  • 将集合 S x S_x Sx​ 合并到集合 S y S_y Sy​ 处。

对于操作一,直接插入即可。
对于操作二,考虑启发式合并:

  • 若 ∣ S x ∣ < ∣ S y ∣ |S_x|<|S_y| ∣Sx​∣<∣Sy​∣,则枚举 v ∈ S x v \in S_x v∈Sx​ 并将 v v v 插入到 S y S_y Sy​ 中,最后将 S x S_x Sx​ 清空。
  • 若 ∣ S x ∣ > ∣ S y ∣ |S_x|>|S_y| ∣Sx​∣>∣Sy​∣,则枚举 v ∈ S y v \in S_y v∈Sy​ 并将 v v v 插入到 S x S_x Sx​ 中,接着将 S x S_x Sx​ 与 S y S_y Sy​ 调换位置,最后将 S x S_x Sx​ 清空。

我们需要一个 O ( 1 ) O(1) O(1) 插入, O ( 1 ) O(1) O(1) 交换的数据结构,不难想到 STL 中的 vector。其交换的底层实现是直接交换指针,所以插入和交换也是 O ( 1 ) O(1) O(1) 的;相信,写过长链剖分优化 dp \text{dp} dp 的 Oier 都知道。

于是,总复杂度与启发式合并同阶,为 O ( n log ⁡ 2 n ) O(n \log^2 n) O(nlog2n)。AC链接。

因此啊,这题做法与《五彩斑斓的世界》毫无关联,不要像我一样,数据结构学傻了。

F

似乎是比赛中最难的一道题,至少本蒟蒻 VP 时及赛后看题解之前着实不太会做。

Key Observation

序列 t t t 为二分序列当且仅当其中不存在长度为 3 3 3 的下降子序列。

算法一

做过 NOI 2018 冒泡排序的人应该都很容易想到算法一吧。

考虑 dp \text{dp} dp。

令 f i , M , m f_{i,M,m} fi,M,m​ 表示,钦定了序列的前 i i i 位,目前的最大值为 M M M,目前没有作为前缀最大值最大值为 m m m 时,这个状态能够达到 ( 0 / 1 ) (0/1) (0/1)。

考虑转移。假设这一位填上了 k ( k = ± p i ) k(k=±p_i) k(k=±pi​)。

  • 若 k < m k<m k<m,则不能填 k k k,不可转移。
  • 若 m ≤ k ≤ M m \le k \le M m≤k≤M,则有转移 f i , M , m → f i , M , k f_{i,M,m} \to f_{i,M,k} fi,M,m​→fi,M,k​。
  • 若 M < k M<k M<k,则有转移 f i , M , m → f i , k , m f_{i,M,m} \to f_{i,k,m} fi,M,m​→fi,k,m​。

边界: f 0 , − ∞ , − ∞ = 1 f_{0,-∞,-∞}=1 f0,−∞,−∞​=1。

记录转移来源即可构造出一组解。然而,时间复杂度为 O ( ∑ n 3 ) O(\sum n^3) O(∑n3),无法接受。

下面的算法就是我没想到的了,感觉还是对今后的做题有一定启发意义的。

算法二

考虑对状态设计进行转化——令 g i , j g_{i,j} gi,j​ 表示,看了 [ 1 , i ] [1,i] [1,i],最大值为 j j j,没有作为前缀最大值的数的最大值最小可以为多少(有些绕口,建议多读几遍)。

为什么可以进行转化呢?这是因为,若 k 1 > k 2 k_1>k_2 k1​>k2​,纵使 f i , j , k 1 = f i , j , k 2 = 1 f_{i,j,k_1}=f_{i,j,k_2}=1 fi,j,k1​​=fi,j,k2​​=1, f i , j , k 1 f_{i,j,k_1} fi,j,k1​​ 依然是比 f i , j , k 2 f_{i,j,k_2} fi,j,k2​​ 差的。我们完全可以摒弃其中较差的那一个。

考虑 g g g 如何转移。假设这一位填上了 k ( k = ± p i ) k(k=±p_i) k(k=±pi​)。

  • 若 k < g i , j k<g_{i,j} k<gi,j​,则无法转移。
  • 若 g i , j ≤ k ≤ j g_{i,j} \le k \le j gi,j​≤k≤j,则有转移 g i + 1 , j : = min ⁡ ( g i + 1 , j , k ) g_{i+1,j}:=\min(g_{i+1,j},k) gi+1,j​:=min(gi+1,j​,k)。
  • 若 j < k j<k j<k,则有转移 g i , j → g i + 1 , k g_{i,j} \to g_{i+1,k} gi,j​→gi+1,k​。

边界: g 0 , − ∞ = 1 g_{0,-∞}=1 g0,−∞​=1。

时间复杂度 O ( n 2 ) O(n^2) O(n2),无法通过本题。

算法三

与算法二同构,唯一的区别在于 g i , j g_{i,j} gi,j​ 中 j j j 与 g i , j g_{i,j} gi,j​ 的实际意义调换了一下。

算法四

仔细观察我的代码,你会发现——转移的过程中,要么新的 j j j 等于 k k k,要么更新的值等于 k k k!

因此啊,状态 g i , j g_{i,j} gi,j​ 合法,当且仅当 j = k j=k j=k 或 g i , j = k g_{i,j}=k gi,j​=k。

综上所述,我们定义状态 h i , p , q h_{i,p,q} hi,p,q​ 表示,目前看了 [ 1 , i ] [1,i] [1,i],目前最大值还是非前缀最大值的最大值为 k k k( p = 0 / 1 p=0/1 p=0/1),以及目前 k k k 是 p i p_i pi​ 还是 − p i -p_i −pi​( q = 0 / 1 q=0/1 q=0/1),其中 h i , p , q h_{i,p,q} hi,p,q​ 存储的是另一个的最大值。这样一来,只要结合算法二与算法三的转移,总复杂度就是线性的了。

总复杂度 O ( n ) O(n) O(n),完美解决本题。代码懒得写

Summary

本题是一道非常不错的 dp \text{dp} dp 题,有一定难度。

首先,我们应该凭借直觉猜出 Key Observation,然后凭借已有的做题经验顺理成章地想出 O ( n 3 ) O(n^3) O(n3) 的算法一。关键在于优化

算法一中的 dp \text{dp} dp 存储的只有 0 , 1 0,1 0,1 而没有具体的值,并且同对 ( i , j ) (i,j) (i,j) 对应的 k k k 之间有鲜明的强弱关系,这引导我们将第三维缩掉作为存储的值。于是得到 O ( n 2 ) O(n^2) O(n2) 做法。

接着,我们需要察觉到——对于一个二分序列,从左往右扫描的过程中,一个数要么作为非前缀最大值中的最大值,要么作为前缀最大值,否则不合法。因此,得到结论——状态合法当且仅当其存储的值或其第二维度就是 k k k。然后就能得到线性的正解了。

观察整个思路流程,其实就是秉承了降维的思想,先后使用分明的强弱关系以及题目的特别性质将后两维缩掉。因此,我们要细致观察强弱关系是否鲜明以及特别性质,以便于最终将状态优化数到可以接受的量。

G

板子题。

令 f s f_s fs​ 表示,集合 s s s 中的字符串的 f f f 值。
令 g s g_s gs​ 表示,作为 s s s 中所有字符串的公共子序列的字符串数量。

通过容斥,容易得到

f s = ∑ t ∈ s ( − 1 ) ∣ t ∣ − 1 g t f_s=\sum_{t \in s} (-1)^{|t|-1} g_t fs​=t∈s∑​(−1)∣t∣−1gt​

显然,只要求出了 g g g,则可以通过一遍 FWT O ( 2 n n ) O(2^n n) O(2nn) 地求得 f f f;所以关键在于如何求出 g g g。

注意到各个字符串中字符都是有序的,所以不难发现——若字符串 T T T 是 S s 1 , S s 2 , ⋯ , S s k S_{s_1},S_{s_2},\cdots,S_{s_k} Ss1​​,Ss2​​,⋯,Ssk​​,当且仅当 T T T 是有序的,且 ∀ c ∈ [ 1 , 26 ] \forall c \in [1,26] ∀c∈[1,26], T T T 中 c c c 出现的次数不超过 S s 1 , S s 2 , ⋯ , S s k S_{s_1},S_{s_2},\cdots,S_{s_k} Ss1​​,Ss2​​,⋯,Ssk​​ 中的任何一个字符串中 c c c 的数量。因此,通过乘法原理很容易得出, g s g_s gs​ 就是 s s s 中各个字符串中 1 1 1 出现的次数的最小值 × \times × 2 2 2 出现次数的最小值 ⋯ \cdots ⋯ × \times × 26 26 26 出现次数的最小值。通过递推可以做到 O ( 2 n × 26 ) O(2^n \times 26) O(2n×26)。

从而,总复杂度为 O ( ( n + 26 ) 2 n ) O((n+26)2^n) O((n+26)2n),可以通过本题。AC链接。

Educational Codeforces Round 119 (Rated for Div. 2) EFG 题解相关推荐

  1. Educational Codeforces Round 104 (Rated for Div. 2)A-E题解

    Educational Codeforces Round 104 (Rated for Div. 2)A-E题解 比赛链接:https://codeforces.ml/contest/1487 A题 ...

  2. Educational Codeforces Round 119 (Rated for Div. 2)

    D. Exact Change E. Replace the Numbers G. Subsequences Galore  因为1和2的数量最大值不是很多,多了的话可以用3代替,那么枚举1和2的数量 ...

  3. Educational Codeforces Round 119 (Rated for Div. 2) 做题日志

    A Equal or Not Equal 题意 给你一个字符串, s i = = E si == E si==E表示 a ( i ) = = a ( i + 1 ) a(i) == a(i+1) a( ...

  4. Educational Codeforces Round 90 (Rated for Div. 2)部分题解

    A - Donut Shops 题解: 1.我们首先特判一下包装盒里面只有一个物品的情况,如果只装了一个物品,那我们就直接比较这两个物品的单价即可. 2.如果盒子里面装的不止是一键物品,那么我们就需要 ...

  5. Educational Codeforces Round 131 (Rated for Div. 2) A-D题解

    题目 A. Grass Field B. Permutation C. Schedule Management D. Permutation Restoration A. Grass Field 题解 ...

  6. Educational Codeforces Round 105 (Rated for Div. 2) A-D题解

    A. ABC String 题意 给你一个只包含 A.B.C的字符串,每类字符都有可能代表左右括号中的一种,问你是否能找到一个方式使得括号匹配合法 三个字符,每个字符有两种情况 总计 2^3 = 8次 ...

  7. Educational Codeforces Round 114 (Rated for Div. 2) 个人题解

    中秋节快乐! A. Regular Bracket Sequences 题意 输出nnn个不同的长度为2n2n2n的合法括号序列. 分析 先输出一个"()()()-"序列. 然后依 ...

  8. Educational Codeforces Round 113 (Rated for Div. 2) 个人题解 ABCD

    A. Balanced Substring 题意 从给定的ababab串中找到任意一个a,ba,ba,b数量相等的子串并输出.如果找不到输出−1−1-1 -1−1−1. 分析 如果一个较大的子串符合要 ...

  9. Educational Codeforces Round 112 (Rated for Div. 2) 个人题解

    A. PizzaForces 题意 有三种披萨制作方案:15分钟制作6片.20分钟制作8片和25分钟制作10片. 问制作出至少nnn片披萨要多少分钟 分析 三种方案的效率都一样,都是每分钟制作0.4个 ...

最新文章

  1. Moving Towards Third‐Generation Sequencing Technologies 迈向第三代测序技术
  2. flask执行python脚本_如何在Flask中运行python脚本
  3. Mac 如何操控远程的 Windows 电脑
  4. python的matplotlib生成colorbar
  5. tcp协议seq和ack
  6. 联想计算机主机编号,联想如何查找主机编号
  7. java 104规约_电网104规约解包(java)
  8. Ctfmon.exe是什么进程?
  9. 关于K2路由破解锐捷校园认证这件事(ZZU版)
  10. 登陆apple pay显示无法登录服务器,apple pay无法添加卡怎么办?未能连接到apple pay的解决方法...
  11. Hybrid Trajectory Planning for Autonomous Driving in On-Road Dynamic Scenarios文章解读
  12. sapi/cgi/php-cgi,sapi/cgi/php-cgi
  13. 华三c语言笔试,H3C笔试及答案解析
  14. 卫星影像领域的深度学习数据和模型项目
  15. 十大工业物联网常用传感器,你用过哪些?
  16. cocos creator 牌面翻转
  17. views文件的作用
  18. 大促活动前团购系统流量预算和容量评估
  19. 网站兼容性(持续更新)
  20. 高等数学:第二章 导数与微分(5)隐函数的导数,由参数方程所确定的函数的导数

热门文章

  1. Unity Shader 麻将平面阴影高光
  2. 华为关于LINUX的认证,华为认证:华为TA128在LINUX下的简单设置
  3. 接口测试实战| GET/POST 请求区别详解
  4. (一)掰开了,揉碎了,说经典halcon中的那些算子
  5. css3 实现十字光标和光标外圆圈环绕
  6. 2016-12-28 迪米特法则+依赖倒转原则+里氏替换原则
  7. 实现小说自由,国产浏览器出手了,吊打各类阅读软件
  8. 【ZZULIOJ】1008: 美元和人民币
  9. elasticsearch的基础使用(二)
  10. 华为会用鸿蒙系统吗,华为P40会用鸿蒙系统是真的吗 华为p40上市时间介绍