Codeforces Round 947 (Div. 1 + Div. 2) A~H
Codeforces Round 947 (Div. 1 + Div. 2)
A
模拟。
B
最小的 \(a\) 肯定作为 \(i\)。对于不被 \(i\) 整除的,最小的那个作为 \(j\),判断是否合法即可。
C
二分答案。容易发现合法即存在两个 \(1\) 的距离 \(\le 2\)。
D
对于后手,当他走到一个红色点之后,接下来就没有任何限制了。所以先求出相遇点(可能不在点上,无伤大雅)。然后求以这个点为根的最长链即可。
E
一条路径必然存在两个端点,用 set 维护这两个端点,即叶子集合。
判断 \(u,v\) 是否合法,直接维护哈希值,判断其是否等于树上对应链的哈希值。
复杂度 \(O(n\log n)\)。
F
注意到是对于任意一个 \(T\) 都成立,肯定不能一个一个判。考虑把 \(T\) 按照最高位分成两组,除去这个最高位后它们就是相同的。
分讨:
- 若 \(S\) 的最高位是 \(0\),那么相当于 \(\forall t\le 2^{n-1}-1,|S\cap T|\in V_{t}\) 且 \(|S\cap T|\in V_{t+2^{n-1}-1}\),那其实就是 \(V_{t}\) 和 \(V_{t+2^{n-1}}\) 取与。
- 另外一种情况就是 \(V_{t}\) 和 \(V_{t+2^{n-1}}>>1\) 取与。
DFS 做到 \(O(n2^{n})\)。
G
首先假设没有 *,直接判断即可。
假设两个串都有 *,那么发现一个必要条件是两串的一段前缀需要匹配,两串的一段后缀需要匹配。不难得出这个就是充要的。因为中间的剩余部分已经满足两边均存在 *,两边的 * 都可以带一些数删去,然后又会变成一个两边都有 * 的情况,所以一定合法。
剩下的情况就是只有一边有 *,这些 * 把原来的串分成了 \(k\) 段,我们需要给每一段找到在另一个串中出现的位置,且这些串不能相交。那其实就是求出每个串在原串中的最小出现位置。暴力找匹配是 \(O(kn\log n)\) 的,但是注意我们并不需要把 \(1\sim n\) 拿出来找匹配,对于一个匹配位置 \(p\),只需要拿出来 \(1\sim p+k-1\) 就足矣。所以考虑倍增匹配,无论是否合法,每次都会删去同等级别的位置。因为一共只有 \(n\) 个位置,所以总的复杂度为 \(O(n\log n)\)。
H
首先肯定是把最大的字符 \(c\) 全部拿出来。发现最优情况下开头和结尾一定都是 \(c\),因为对于那些在第一个 \(c\) 前面的点,我们显然可以把他们放到第二个 \(c\) 的前面,这样一定更优。
那么整个串就形如 \(cs_{1}cs_{2}cs_{3}\dots cs_{k}c\)。假设 \(s_{i}\) 现在已经确定了,那么我们可以把 \(cs_{i}\) 看成一个整体,那么就递归成了一个子问题,即 \((cs_{1}),(cs_{2})\dots,(cs_{k}),c\) 这个串。不过此时比较并不是比较字典序,对于 \(cs_{i}\),后面需要加上一个 \(+\inf\),对于末尾 \(c\) 就再后面加上 \(-\inf\)。
于是现在我们只需要讨论每个 \(s_{i}\) 该怎么选能够使得答案最小。注意到 \(s_{i}\) 内部肯定递增,所以可以想到从小到大枚举每个字符 \(c'\),一个直接的想法是维护一个最大值集合 \(S\) 表示当前的最大值。每次把最小的 \(|S|\) 个字符添到 \(S\) 的每个最大值后面,然后会有一部分最大值被删去。反复维护这个过程。
直到出现剩下的字符不够了,另一个直接的想法是均摊地插入到这些最大值中间,使得长度最小,但是这样会有一些情况有问题。比如顺序会造成一些奇怪的影响。不过注意到此时每个 \(c\) 后面至多跟上一个字符,发现实际上 \(s_{i}\) 已经确定了,就是剩下的字符,如果不够的就是空的,于是可以递归到子问题 \((cs_{i})\)。
分析复杂度,设最开始 \(c\) 的个数有 \(a\) 个,不是 \(c\) 的个数有 \(b\) 个。
- 如果是第一种情况,即 \(a\le b\),那么一次递归会使得 \(a>b'\)。
- 如果是第二种情况,即 \(a>b\),那么一次递归会使得 \(a'=a-b\),不过注意到只要单个的 \(c\) 存在,那么它肯定是最大值,所以下一次我们并不需要重新计算 \(c\)。所以实际上我们可以使得 \(a'=a\bmod b\)。
总的递归轮数就是 \(O(\log n)\) 的,复杂度 \(O(n\log n)\)。
上述的递归过程访问了多次不是最大值的元素,这里有一个更优秀的做法。我们维护一个有序的序列 \(S\),最开始 \(S=\{-\inf,s_{1},s_{2},\dots,s_{n}\}\)(排序后的)。维护一个指针 \(pos\) 来表示当前为最大值的后缀。
从小到大扫 \(S\),每次把 \(S_{i}\) 加到 \(S_{pos}\) 的后面,然后 \(pos\) 加一。直到 \(pos=n+1\) 后,暴力往回跳寻找新的后缀。如果 \(S_{n}\) 的结尾是 \(-\inf\),则停止递归,输出 \(S_{n}\) 除去 \(-\inf\) 的部分。
为什么这样是对的呢?考虑每次添加,如果 \(S_{i}\) 结尾是 \(-\inf\),则表示这一轮递归开始了,第一个加到的位置就是末尾的 \(c\)。然后后面的数加到其他 \(c\),实际上就是上面的操作。
分析复杂度,注意到实际上 \(pos\) 每次往回跳后得到的新的 \(pos\) 一定不会比原来的小,所以复杂度是 \(O(n)\) 的。
Codeforces Round 947 (Div. 1 + Div. 2) A~H的更多相关文章
- Educational Codeforces Round 60 (Rated for Div. 2) - C. Magic Ship
Problem Educational Codeforces Round 60 (Rated for Div. 2) - C. Magic Ship Time Limit: 2000 mSec P ...
- Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems(动态规划+矩阵快速幂)
Problem Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems Time Limit: 3000 mSec P ...
- Educational Codeforces Round 43 (Rated for Div. 2)
Educational Codeforces Round 43 (Rated for Div. 2) https://codeforces.com/contest/976 A #include< ...
- Educational Codeforces Round 35 (Rated for Div. 2)
Educational Codeforces Round 35 (Rated for Div. 2) https://codeforces.com/contest/911 A 模拟 #include& ...
- Codeforces Educational Codeforces Round 44 (Rated for Div. 2) F. Isomorphic Strings
Codeforces Educational Codeforces Round 44 (Rated for Div. 2) F. Isomorphic Strings 题目连接: http://cod ...
- Codeforces Educational Codeforces Round 44 (Rated for Div. 2) E. Pencils and Boxes
Codeforces Educational Codeforces Round 44 (Rated for Div. 2) E. Pencils and Boxes 题目连接: http://code ...
- Educational Codeforces Round 63 (Rated for Div. 2) 题解
Educational Codeforces Round 63 (Rated for Div. 2)题解 题目链接 A. Reverse a Substring 给出一个字符串,现在可以对这个字符串进 ...
- Educational Codeforces Round 39 (Rated for Div. 2) G
Educational Codeforces Round 39 (Rated for Div. 2) G 题意: 给一个序列\(a_i(1 <= a_i <= 10^{9}),2 < ...
- Educational Codeforces Round 48 (Rated for Div. 2) CD题解
Educational Codeforces Round 48 (Rated for Div. 2) C. Vasya And The Mushrooms 题目链接:https://codeforce ...
- Educational Codeforces Round 60 (Rated for Div. 2) 题解
Educational Codeforces Round 60 (Rated for Div. 2) 题目链接:https://codeforces.com/contest/1117 A. Best ...
随机推荐
- GNU GCC学习
1 Introduction 参考视频:1 GCC简介_哔哩哔哩_bilibili 参考书籍:<An Introduction to GCC (Brian J. Gough, Richard.p ...
- 数据结构之栈(Java,C语言的实现)以及相关习题巩固
目录 栈 概念以及代码实现 例题 232. 用栈实现队列 1614. 括号的最大嵌套深度 234. 回文链表 1614. 括号的最大嵌套深度 LCR 123. 图书整理 I 206. 反转链表 402 ...
- vue3项目安装依赖报错 npm ERR! code ERESOLVE
vue3项目安装依赖报错 npm ERR! code ERESOLVE npm ERR! ERESOLVE could not resolve npm ERR! npm ERR! While reso ...
- codemirror-editor-vue3 编辑器只要换行保存就会有小红点
先看示例 找了篇博客写的贼详细 https://blog.csdn.net/xujingyiss/article/details/118992763 只要设置这二个 let conten ...
- web服务器 传统开发和前后端分离开发 服务器相关概念
web服务器 Web服务器一般指的是网站服务器,是指驻留因特网上某一台或N台计算机的程序,可以处理浏览器等Web客户端的请求并返回相应响应,目前最主流的三个Web服务器是Apache. Nginx . ...
- 【原创】EtherCAT主站IgH解析(二)-- Linux/Windows/RTOS等多操作系统IgH EtherCAT主站移植指南
版权声明:本文为本文为博主原创文章,转载请注明出处.如有问题,欢迎指正.博客地址:https://www.cnblogs.com/wsg1100/ 前言 目前,EtherCAT商用主站有:Aconti ...
- tortoisegit 配置ssh登录
习惯使用小乌龟. 服务器:gitblit 客户端:TortoiseGit 2.13.0.1 (C:\Program Files\TortoiseGit\bin) git version 2.36.1. ...
- Android/SELinux 添加 AVC 权限
Android/SELinux 添加 AVC 权限 背景 在Android应用层中编写c/c++应用时,发现接口调用出现问题,logcat才知道是因为:权限不够. type=1400 audit(0. ...
- Windows 编译 FFMpeg
Windows 编译 FFMpeg 背景: 为了提高公司产品的质量,对FFMPEG进行优化,需要重新编译. Host :Windows-10,core-i7 MinGW :网络版 pkg-config ...
- React项目国际化-React-intl
npx create-react-app react-intl-demo && cd react-intl-demo,创建react-intl-demo项目.npm install r ...