最近都会做一些 \(\rm Div1\) 套题中 \(3000\) 分以下的题目。

A

直接枚举贪心即可。

B

首先不难发现总共可能的 \(c\) 序列只有 \(k!\) 种,很明显要暴力枚举所有情况然后快速判断。

不难发现,判定条件为原图中保留的边会将原图划分成若干个互不相交的简单环,换句话说:所有点的入度与出度均为 \(1\)。

注意到出度一定为 \(1\),只需判断所有点的入度为 \(1\) 即可。

于是可以得到一个 \(\mathcal{O(k!n)}\) 的做法,但实际上可以直接预处理出出度为 \(i\) 的点走出第 \(c_i\) 条边而每个点增加的入度,哈希直接判断即可。

复杂度 \(\mathcal{O(k!k + nk ^ 2)}\)。

实际上对于这类合法方案的计数问题,多数情况下会从找出合法的简单充要条件下手。对于复杂的情形,往往可以找出若干个必要条件组成充要条件。

C

可以发现,这些操作本质上是可以将 \(0 \ / \ 1\) 分别增加或减少 \(1\),或同时减少或增加 \(01\)。

但因为字串的连续性可能做不到随意删去 \(01\),只能从构造 \(t\) 串的角度使得能随意执行上述的本质操作。

不难发现只需要将 \(t\) 串构造成 \(1111 \cdots 00000\) 这种形式即可。

那么现在 \(s\) 距离 \(t\) 的大小就之和 \(s, t\) 中 \(0, 1\) 数量有关了。

于是问题可以转化为:给定 \(n\) 个二元组 \((x, y)\) 每次可以使得 \(x, y \pm 1\) 或 \(x, y\) 同时 \(\pm 1\),求一个二元组 \((x_0, y_0)\) 使得这 \(n\) 个二元组到此二元组最大距离最小。

不难发现可以二分答案大小,那么问题又可以转化为这 \(n\) 个二元组能在 \(L\) 次内到达的点中是否存在交集。

直接求交集是不好求的,不妨反过来,考虑一个二元组能到达的区域对 \(x_0, y_0\) 的限制,这样求交就很简单了。

具体地,可以描述为 \(x_0, y_0, x_0 - y_0\) 的上下界。

需要注意的是,\(t\) 不能为空串。

复杂度 \(\mathcal{O(n \log n)}\)。

对于这类操作性的问题,如果发现可以将操作简化或合并不失为一个好的选择。

同时,每当自己发现一条性质以后,一定要思考这个问题能否转化为一个本质相同的更为简单的问题,尝试用简化的语言描述这个得到的新问题。

注意该做法中区域求交的方式,这是一种通用做法。同时,如果出现二元组能进行两个维度的变化时,可以尝试放到坐标轴下更为直观地观察此问题。

D

首先,一条合法链的两种情况本质上是相同的,可以合并为一种:

不妨对于一条边 \((u, v)(b_u > b_v)\),看作是 \(u \rightarrow v\) 的一条有向边,那么一条合法链就是一条连续的有向链。

那么对于 \(b_u = b_v\) 的情况呢?不难发现其双向都可以,先不考虑这种情况。

继续观察可以发现,一个点对答案的贡献就是经过其的链数乘权值。那么对于 \(i \rightarrow u \rightarrow j\) 就能合并这两条边减少一次贡献,那么一个点对答案的贡献就是 \(\max(in_u, out_u) \times a_u\)。

接下来考虑 \(b_u = b_v\) 的情况,需要我们确定这种边的方向最小化总贡献。

可以发现,对于一个点 \(u\) 只关乎其儿子 \(v(b_u = b_v)\) 与其的边的方向,不妨设计一个 \(dp\),令 \(f_{u, 0 / 1}\) 表示 \(u\) 与其父亲的连边向下还是向上。

那么转移可以被刻画为一个新的问题:从每个二元组 \((a_i, b_i)\) 中选择一个元素出来,最终贡献为 \(\sum d_i + \max(c_0 + c_a, c_1 + c_b) \times a_u\) 其中 \(d\) 为选择的序列,\(c_0, c_1, c_a, c_b\) 分别代表选择的 \(a, b\) 个数及开始已经确定方向的选择个数。

因为变量过多,不妨枚举 \(c_0\) 的数量,那么此时 \(c_0, c_1, c_a, c_b\) 数量均已确定,问题近一步转化为:

从每个二元组 \((a_i, b_i)\) 中选择一个元素出来,恰好满足选择的 \(a, b\) 个数分别为 \(c_0, c_1\),最小化 \(\sum\limits_{i \in A} a_i + \sum\limits_{i \in B} b_i(|A| + |B| = m)\)

这是一个经典问题,即为最小化:\(\sum a_i + \sum\limits_{i \in B} b_i - a_i(|A| + |B| = m)\),只需选取最小的 \(c_1\) 个 \(b_i - a_i\) 即可。

复杂度 \(\mathcal{O(n \log n)}\)。

该做法的第一步将本质相同的合法状态合并成了一种,这种转化方式值得学习。

注意变量较多是可以枚举其中一个或若干个,逐个击破。

最后这个经典的问题告诉我们,将最优化问题写成一个式子,对答案进行变形转化所求。

CF 1394 简要题解的更多相关文章

  1. Noip 2014酱油记+简要题解

    好吧,day2T1把d默认为1也是醉了,现在只能期待数据弱然后怒卡一等线吧QAQ Day0 第一次下午出发啊真是不错,才2小时左右就到了233,在车上把sao和fate补掉就到了= = 然后到宾馆之后 ...

  2. Tsinghua 2018 DSA PA2简要题解

    反正没时间写,先把简要题解(嘴巴A题)都给他写了记录一下. upd:任务倒是完成了,我也自闭了. CST2018 2-1 Meteorites: 乘法版的石子合并,堆 + 高精度. 写起来有点烦貌似. ...

  3. Codeforces 863 简要题解

    文章目录 A题 B题 C题 D题 E题 F题 G题 传送门 简要题解?因为最后一题太毒不想写了所以其实是部分题解... A题 传送门 题意简述:给你一个数,问你能不能通过加前导000使其成为一个回文数 ...

  4. HNOI2018简要题解

    HNOI2018简要题解 D1T1 寻宝游戏 题意 某大学每年都会有一次 Mystery Hunt 的活动,玩家需要根据设置的线索解谜,找到宝藏的位置,前一年获胜的队伍可以获得这一年出题的机会. 作为 ...

  5. JXOI2018简要题解

    JXOI2018简要题解 T1 排序问题 题意 九条可怜是一个热爱思考的女孩子. 九条可怜最近正在研究各种排序的性质,她发现了一种很有趣的排序方法: Gobo sort ! Gobo sort 的算法 ...

  6. BJOI2018简要题解

    BJOI2018简要题解 D1T1 二进制 题意 pupil 发现对于一个十进制数,无论怎么将其的数字重新排列,均不影响其是不是 \(3\) 的倍数.他想研究对于二进制,是否也有类似的性质. 于是他生 ...

  7. CQOI2018简要题解

    CQOI2018简要题解 D1T1 破解 D-H 协议 题意 Diffie-Hellman 密钥交换协议是一种简单有效的密钥交换方法.它可以让通讯双方在没有事先约定密钥(密码)的情况下,通过不安全的信 ...

  8. AtCoder ExaWizards 2019 简要题解

    AtCoder ExaWizards 2019 简要题解 Tags:题解 link:https://atcoder.jp/contests/exawizards2019 很水的一场ARC啊,随随便便就 ...

  9. Comet OJ - Contest #2 简要题解

    Comet OJ - Contest #2 简要题解 cometoj A 模拟,复杂度是对数级的. code B 易知\(p\in[l,r]\),且最终的利润关于\(p\)的表达式为\(\frac{( ...

随机推荐

  1. Codeforces 888C: K-Dominant Character(水题)

    You are given a string s consisting of lowercase Latin letters. Character c is called k-dominant iff ...

  2. Dart 2.15 现已发布

    作者 / Michael Thomsen, Dart & Flutter Product Manager, Google 我们已经正式发布了 Dart SDK 的 2.15 版本,该版本新增了 ...

  3. 编写Java程序_输入本部门五位员工的薪资,并根据用户输入的序号为指定员工进行提薪。若用户输入序号出现越界,则提示错误。

    要求说明: 输入本部门五位员工的薪资,并根据用户输入的序号为指定员工进行提薪.若用户输入序号出现越界,则提示错误. 运行效果如图: 实现代码: import java.util.Scanner; pu ...

  4. Java高级程序设计笔记 • 【目录】

    持续更新中- 我的大学笔记>>> 章节 内容 实践练习 Java高级程序设计作业目录(作业笔记) 第1章 Java高级程序设计笔记 • [第1章 IO流] 第2章 Java高级程序设 ...

  5. 编写Java程序,演练匿名内部类应用

    返回本章节 返回作业目录 需求说明: 定义一个抽象类 Bird,创建使用匿名内部类的操作类Action. 实现思路: 定义抽象类Bird.在其中定义一个String类型的name属性,一个返回类型是i ...

  6. Exchange ProxyLogon漏洞分析

    Exchange ProxyLogon漏洞分析 前言 续前文继续学习Exchange漏洞 Proxyshell 影响范围 Exchange Server 2019 < 15.02.0792.01 ...

  7. windows下的pycharm下载与安装(不包括激活)

    Pycharm的下载与安装 首先兄弟们我们依旧在浏览器输入pycharm的网址链接 PyCharm: the Python IDE for Professional Developers by Jet ...

  8. SpringBoot集成MyBatis-Plus自定义SQL

    1.说明 本文介绍Spring Boot集成MyBatis-Plus框架后, 基于已经创建好的Spring Boot工程, 添加自定义的SQL实现复杂查询等操作. 自定义SQL主要有两种方式, 一种是 ...

  9. 初识python: 继承实例 - 学校、老师、学生

    对学校.老师.学生做一个分类,并抽象成类.并实现各自的一些功能.代码如下: 父类1:学校 # 学校 class School(object): def __init__(self,name,addr) ...

  10. vi中使用鼠标右键插入时进入(insert)visual模式

    使用vim插入外面复制的内容时,用右键点击后,并未将内容粘贴进去,而是进入了(insert)visual模式,解决方法:先shift+enter进入普通模式输入 set mouse-=a然后再i进入i ...