CF 1394 简要题解
最近都会做一些 \(\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 简要题解的更多相关文章
- Noip 2014酱油记+简要题解
好吧,day2T1把d默认为1也是醉了,现在只能期待数据弱然后怒卡一等线吧QAQ Day0 第一次下午出发啊真是不错,才2小时左右就到了233,在车上把sao和fate补掉就到了= = 然后到宾馆之后 ...
- Tsinghua 2018 DSA PA2简要题解
反正没时间写,先把简要题解(嘴巴A题)都给他写了记录一下. upd:任务倒是完成了,我也自闭了. CST2018 2-1 Meteorites: 乘法版的石子合并,堆 + 高精度. 写起来有点烦貌似. ...
- Codeforces 863 简要题解
文章目录 A题 B题 C题 D题 E题 F题 G题 传送门 简要题解?因为最后一题太毒不想写了所以其实是部分题解... A题 传送门 题意简述:给你一个数,问你能不能通过加前导000使其成为一个回文数 ...
- HNOI2018简要题解
HNOI2018简要题解 D1T1 寻宝游戏 题意 某大学每年都会有一次 Mystery Hunt 的活动,玩家需要根据设置的线索解谜,找到宝藏的位置,前一年获胜的队伍可以获得这一年出题的机会. 作为 ...
- JXOI2018简要题解
JXOI2018简要题解 T1 排序问题 题意 九条可怜是一个热爱思考的女孩子. 九条可怜最近正在研究各种排序的性质,她发现了一种很有趣的排序方法: Gobo sort ! Gobo sort 的算法 ...
- BJOI2018简要题解
BJOI2018简要题解 D1T1 二进制 题意 pupil 发现对于一个十进制数,无论怎么将其的数字重新排列,均不影响其是不是 \(3\) 的倍数.他想研究对于二进制,是否也有类似的性质. 于是他生 ...
- CQOI2018简要题解
CQOI2018简要题解 D1T1 破解 D-H 协议 题意 Diffie-Hellman 密钥交换协议是一种简单有效的密钥交换方法.它可以让通讯双方在没有事先约定密钥(密码)的情况下,通过不安全的信 ...
- AtCoder ExaWizards 2019 简要题解
AtCoder ExaWizards 2019 简要题解 Tags:题解 link:https://atcoder.jp/contests/exawizards2019 很水的一场ARC啊,随随便便就 ...
- Comet OJ - Contest #2 简要题解
Comet OJ - Contest #2 简要题解 cometoj A 模拟,复杂度是对数级的. code B 易知\(p\in[l,r]\),且最终的利润关于\(p\)的表达式为\(\frac{( ...
随机推荐
- 主流的 API 架构
1. RPC:调用另一个系统的函数 2. SOAP:使数据作为服务可用 3. REST:使数据作为资源可用 4. GraphQL:仅请求所需要的数据 1. RPC:调用另一个系统的函数 远程过程调用是 ...
- Rank & Sort Loss for Object Detection and Instance Segmentation 论文解读(含核心源码详解)
第一印象 Rank & Sort Loss for Object Detection and Instance Segmentation 这篇文章算是我读的 detection 文章里面比较难 ...
- JavaWeb项目作业 Market商品管理系统
目录 一.语言和环境 二.实现功能 三.数据库设计 四.实现代码 一.语言和环境 实现语言:Java语言. 环境要求:MyEclipse(Eclipse)+MySQL. 实现方式:JBDC.jsp/s ...
- 前端必备,5大mock省时提效小tips,用了提前下班一小时
一.一些为难前端的业务场景 在我的工作经历里,需要等待后端童鞋配合我的情形大概有以下几种: a.我们跟外部有项目合作,需要调用到第三方接口. 一般这种情况下,商务那边谈合同,走流程,等第三方审核, ...
- Jenkins_创建git任务(3)
jenkins创建git任务,需要使用插件 点击Manage Jenkins,点击Manage Plugins 点击Available搜索git,安装git plugin 进入项目管理界面,会有个Gi ...
- 初识python 之 爬虫:爬取双色球中奖号码信息
人生还是要有梦想的,毕竟还有python.比如,通过python来搞一搞彩票(双色球).注:此文仅用于python学习,结果仅作参考.用到知识点:1.爬取网页基础数据2.将数据写入excel文件3.将 ...
- vue中另一种路由写法
一个项目中一级菜单是固定的,二级及其以下的菜单是动态的,直接根据文件夹结构写路由 import Vue from 'vue' import Router from 'vue-router' impor ...
- 一文看懂B端产品和C端产品
大纲 什么是B端产品 什么是C端产品 为什么会产生B端产品和C端产品 怎么判断一个产品是B端还是C端 B端产品和C端产品存在哪些差异 C端产品经理如何向B端产品经理转型 写在最后 什么是B, Bu ...
- WebRTC本地选择codec(web本地模拟)
视频编码后,再进行发送.WebRTC建立视频连接前,可以选择codec.一般来说支持多种codec,以VP8和H264为代表. Codec: 编码译码器,编解码器 示例代码 写一个示例,用户可以在发送 ...
- java下拉框转换公共方法
1. 下拉框实例类 import org.apache.commons.beanutils.PropertyUtils; import org.apache.commons.lang3.Boolean ...