Codeforces VP/补题小记 (持续填坑)
Codeforces VP/补题小记
1149 C. Tree Generator
给你一棵树的括号序列,每次交换两个括号,维护每次交换之后的直径。
考虑括号序列维护树的路径信息和,是将左括号看做 \(-1\) ,右括号看做 \(1\) ,那么一段竖直向上的路径可以表示为括号序列的一个区间和,一段竖直向下的路径可以看做括号序列的一个区间和的相反数。我们要维护的是树的直径,也就是一段连续的和减去紧随其后的一段连续的差。具体来说就是
\[
\max_{\forall [l,r]}\{\sum_{i=l}^kw[i]-\sum_{i=k+1}^r w[i]\}
\]
可以简单的证明如果选取的区间不能代表树上的路径,取到的式子的和一定不是最优解,线段树维护这个式子即可。维护起来略有麻烦,类似于维护区间最大子段和,更新的时候需要多记几个信息。复杂度 \(\mathcal O (n\log n)\) 。
1149 D. Abandoning Roads
\(n\) 个点 \(m\) 条边且仅有两种边权 \(a, b (a<b)\) 的无向简单图 \(G\),\(\forall i\) 求出 \(G\) 的所有最小生成树中,\(1-i\) 的路径的最小长度。\(1\leq n\leq 70,n-1\leq m \leq 200\) 。
这个题我一开始想了一个错误的做法,先求出最小生成树中 \(b\) 边的数量记为 \(k\) ,然后分别求出 \(1\) 到各个点经过不超过 \(k\) 条 \(b\) 边的最短路。这个做法的错误之处在于,虽然可以证明起始端点都在路径上的 \(a\) 边不会环切掉路径上的 \(b\) 边,但是只要令始端点在路径上就能环切了。
期间我还考虑了另外一种做法,后来得知后一种思路是可以扩展到正解的。考虑将所有 \(a\) 边缩成若干个联通块,不难证明,如果一条生成树的路径离开了一个联通块后又进入了这个联通块,这棵生成树一定不是最小生成树,因为其选择了会被环切的 \(b\) 边。此时直接大力状压 \(dp\) 的复杂度是 \(O(2^nm)\) 的。
再往下分析,如果一个联通块大小 \(\leq 3\) ,那么即使存在离开这个联通块后又来到这个联通块的路径,这条路径也必然不是最短路,因为这样联通块内部最长的边是 \(2a\) ,而做上述操作需要 \(2b\) 。所以可以直接忽视掉所以大小 \(\leq 3\) 的联通块的限制,复杂度优化到 \(\mathcal O (2^{\frac{n}{4}}m)\)。
1168 C. And Reachability
有一个长度为 \(n\) 的序列 \(A\) , \(i,j\) 之间有一条有向边当且仅当 \(i < j, A[i] \text{ and } A[j] > 0\) ,每次给出 \(x, y(x<y)\) ,询问从 \(x\) 出发是否能到达 \(y\) 。
按位考虑,对于当前数 \(A[x]\) ,其能直接到达后面所有和其有共同位的数。显然,对于每一位,较前面的数能到达较后面的数,所以只需要维护每一个数 \(A[x]\) 其能到达某一位有 \(1\) 的最前面的数的位置即可。最后判断 \(A[y]\) 的某一位 \(1\) 是否能被 \(A[x]\) 在其之前到达。复杂度 \(\mathcal O(n\log^2 n)\) 。
1168 D. Anagram Paths
有一棵二叉树,每条边上有小写字母或者 \('?'\) ,每次修改一条边上的字符,要求维护所有叶子到根的路径上的 \('?'\) 填为任意小写字母后是否能重排达到一致, 如果可以,还需输出每种字符的最大可能出现次数。
首先如果所有叶子深度不相等,无论怎么更改边上的字符都是无解。
然后令 \(f[x][c]\) 表示所有 \(x\) 子树内的叶子到 \(x\) 的路径上字符 \(c\) 的数量最大值,\(len[x]\) 表示 \(x\) 到叶子的距离。
我们可以归纳证明,能够重排达到一致当且仅当
\[
\forall x \sum_{c} f[x][c]\leq len[x]
\]
考虑当 \(x\) 是叶子时候,显然充要。对于任意非叶子节点 \(x\),假设其子树内所有点都满足条件,此时必要性显然。充分性考虑先将原先的所有路径排好,对于新加进来的边,如果是一条,则必然合法。如果是两条边,要满足式子必须改变的 \(f[x][c]\) 数量 \(<2\) ,此时另一边会有多出来的问号填上这个字符。
直接暴力维护 \(f[x][c]\) 复杂度是 \(O(nq)\) 的,但是之前的证明启发我们,对于只有一个孩子的节点,可以直接将该节点与孩子合并不影响答案。然后这里有一个二叉树的小套路,如果这样合并,二叉树的深度不超过 \(\mathcal O(\sqrt n)\) 。
证明,如果二叉树不存在只有一个儿子的节点,那么第 \(i\) 层的深度一定要大于第 \(i-1\) 层的深度,此时深度最多为 \(\mathcal O(\sqrt n)\) ,这样直接暴力修改 \(dp\) 值即可,复杂度 \(\mathcal O(q\sqrt n)\)。当然直接动态 \(dp\) 也是可以的。
1188 D. Make Equal
有一个序列 \(a\) ,每次可以花费 \(1\) 的代价将其中一个数加上 \(2\) 的幂次,求将所有数变成相等的数时所需的最少代价。
先将 \(a\) 从小到大排序,若我们将 \(a_n\) 最终加上了 \(S\) ,则 \(a_i\) 最终加上了 \(S+a_n-a_i\) 。那么问题转化为选择一个数 \(S\) ,最小化 \(\sum_{i=1}^n bit(S+a_n-a_i)\) 。
考虑按位 \(dp\) 决策 \(S\) 的每一位选 \(0\) 还是选 \(1\) ,因为最终要处理的贡献是等于 \(a_n-a_i, S\) 这一位数相加以及上一位的进位决定的,我们还需要记录哪些数在当前状态下被进位了。可以发现,假设考虑到了前 \(k\) 位,当前位会进位的数一定是按照 \(\mod 2^k\) 排序结果下的一个后缀,\(dp\) 的时候记录一下这个后缀的长度即可,复杂度 \(\mathcal O (n\log n)\) 。
1098 D. Eels
鱼缸里有一些鱼,鱼有一个属性值 \(w_i\) ,两条鱼 \(i,j(w_i < w_j)\) 可能会合并为一条新的鱼 \(w_i+w_j\) ,如果一次合并的过程中有 \(2w_i\geq w_j\) ,那么称这一次合并是危险的。现在要动态加入删除鱼,维护如果开始一系列的合并,最多可能发生的危险合并次数。
打表发现发生危险合并最多的方式一定是每次取出当前两条最小的鱼进行合并,然后考虑怎么维护这个东西。考虑将当前所有鱼按照 \(w_i\) 排好序,当一条鱼满足 \(w_i > 2\sum_{j=1}^{i-1} w_j\) 时,这条鱼被取出的时候显然不会发生危险的合并。现在我们证明,除此之外的所有鱼被取出的时候,都会发生危险的合并。反证,假设取出的是两条鱼 \(x=w_a+w_b,y=w_c+w_d(2x< y)\) ,即 \(w_a+w_b<w_d\) ,也就是说 \(x\) 会先与 \(w_c\) 合并,不存在这样的两条鱼。那么我们只要动态维护
\[
\sum_{i=1}^{n}[w_i > 2\sum_{j=1}^{i-1} w_j]
\]
用一个维护权值时候的小技巧,将其划分成 \(\log\) 个块,第 \(i\) 个维护权值在 \([2^{i-1},2^i)\) 间的所有鱼,此时,每个块内只有最小值可能产生贡献,用堆来维护这个最小值可以做到 \(\mathcal O(n\log n )\) 的复杂度。
1083 C. Max Mex
有一棵树,树上的节点权值是一个 \(0\) 到 \(n-1\) 的排列,现在动态交换两个节点的权值,要求维护树上所有路径的 \(\text{mex}\) 的最大值。
假设答案是 \(k\) ,那么其合法的充要条件是 \(0-1,1-2,..,(k-1)-k\) 这些路径组成的并仍然是一条路径,我们用线段树维护一个区间内的路径的并的端点,然后在线段树上二分答案,预处理 \(lca\) 复杂度为 \(\mathcal O(n\log n)\) 。
1158 D. Winding polygonal line
平面上有 \(n\) 个点,要求找一个排列,满足相邻连线后不自交,且用一个字符串限制了第 \(i\) 步必须要左转/右转。\(n \leq 2000\) ,保证不存在三点共线的情况。
考虑每次找出在凸包上的任意一个点,其下一个点选择在凸包上左边/右边的点,剩下的点仍然组成一个凸包,且根据凸包的性质,之前选择的点一定不再剩下的点组成的凸包内,这样子分步构造即可,复杂度 \(\mathcal O(n^2)\)。
704 D. Captain America
平面上有 \(n\) 个点,每个点必须涂成红色和蓝色中的一种,花费各为 \(r\) 和 \(b\) 。需要满足 \(m\) 条限制,每条限制形如 \(y=b\) 这条直线上两种颜色的点的数目之差的绝对值不能超过 \(d\) 或 \(x=b\) 这条直线上两种颜色的点的数目之差的绝对值不能超过 \(d\),要求判断是否有解,如果有解还需要最小化花费。\(n,m \leq 10^5\) 。
先考虑判断是否有解, 假设某一行的限制为 \(d\) ,一共有 \(k\) 个点,选了 \(x\) 个红点,满足条件即
\[
|2x-k|\leq d \\
-d \leq 2x-k \leq d \\
\dfrac{k-d}{2}\leq x \leq \dfrac{k+d}{2}
\]
对于列的限制同理,考虑经典的二分图建模,每一个点选红色就让对应行的点和对应列的点连边,那么源点连向行的边和列连向汇点的边就是上面的上下界限制,存在可行流即有解。最小化花费即最大化花费较小的那种颜色的点数,在可行流基础上跑最大流即可。
Codeforces VP/补题小记 (持续填坑)的更多相关文章
- Codeforces 802 补题
codeforces802 A-O Helvetic Coding Contest 2017 online mirror A Heidi and Library (easy) 水题 同B #incl ...
- 持续集成 windows下jenkins常见问题填坑
[过程改进]持续集成 windows下jenkins常见问题填坑 没有什么高深的东西,1 2天的时间大多数人都能自己摸索出来,这里将自己遇到过的问题分享出来避免其他同学再一次挖坑. 目录 1. 主从节 ...
- Codeforces 补题记录
首先总结一下前段时间遇到过的一些有意思的题. Round #474 (Div. 1 + Div. 2, combined) Problem G 其实关键就是n这个数在排列中的位置. 这样对于一个排 ...
- 动归专题QAQ(两天创造的刷题记录哟!✿✿ヽ(°▽°)ノ✿✿)(未填坑)
1092 采药:由于没有限制开始时间和结束时间,01背包就好了 1095 开心的金明:01背包,无fuck说 1104 摆花:f[i][j]表示摆了i种花,第i种花摆了j种的方案数,乱转移0.0(感觉 ...
- Educational Codeforces Round 24 CF 818 A-G 补题
6月快要结束了 期末也过去大半了 马上就是大三狗了 取消了小学期后20周的学期真心长, 看着各种北方的学校都放假嗨皮了,我们这个在北回归线的学校,还在忍受酷暑. 过年的时候下定决心要拿块ACM的牌子, ...
- 【cf补题记录】Codeforces Round #608 (Div. 2)
比赛传送门 再次改下写博客的格式,以锻炼自己码字能力 A. Suits 题意:有四种材料,第一套西装需要 \(a\).\(d\) 各一件,卖 \(e\) 块:第二套西装需要 \(b\).\(c\).\ ...
- 【cf补题记录】Codeforces Round #607 (Div. 2)
比赛传送门 这里推荐一位dalao的博客-- https://www.cnblogs.com/KisekiPurin2019/ A:字符串 B:贪心 A // https://codeforces.c ...
- vue2.0填坑有感(持续更新ing)
1.请求数据 用本地json数据进行mock的时候,一般放在created 过程就Ok了,这样可以尽早获取数据:如果有依赖dom必须存在的清空,就放到mounted里面,具体用法如下所示: // cr ...
- H5填坑笔记--持续更新
最近一直在做移动端的页面,发现很多的坑,这里做一下总结,填填坑…… css常见的问题(一) 一.iOS键盘首字母自动大写 IOS的机子,默认英文输入法状态下,首字母是自动大写的,有时候挺烦人的. 在i ...
随机推荐
- 53、Spark Streaming:输入DStream之Kafka数据源实战
一.基于Receiver的方式 1.概述 基于Receiver的方式: Receiver是使用Kafka的高层次Consumer API来实现的.receiver从Kafka中获取的数据都是存储在Sp ...
- 详解匿名内部类 ,形参为什么要用final
一.使用匿名内部类内部类 匿名内部类由于没有名字,所以它的创建方式有点儿奇怪.创建格式如下: new 父类构造器(参数列表)|实现接口() { //匿名内部类的类体部分 } 在这里我们看到使用匿名内部 ...
- mysql e的n次幂exp()
mysql> ); +-------------------+ | exp() | +-------------------+ | 2.718281828459045 | +---------- ...
- 【BZOJ 1036】 树的统计count
题目 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v: ...
- 对异步处理的http接口进行性能测试
以前对接口做性能测试,接口都是同步处理的,请求之后等待响应结果就知道处理结果了,这样只要看这个接口是否异常,如果无异常无报错记录这个接口的响应时间.TPS等性能指标进行分析就可以了,最近在工作中遇到了 ...
- 测量MySQL的表达式和函数的速度
测量MySQL的表达式和函数的速度,可以调用benchmark()函数.语法格式是benchmark(loop_count,expr).运行的返回值是0,但是mysql会打印一行显示语句大概要执行多长 ...
- 如何下载官网最新版 win10 系统?
如何下载官网最新版 win10 系统?步骤: 一. 下载 遨游浏览器 将UA切换成,手机访问:推荐 UC浏览器,UA设置: Mozilla/5.0 (Linux; U; Android 8.0.0; ...
- c# winform访问 带有windows身份验证的webservice
1 将webservice设置为windows身份验证iis10中,要确认已安装windows身份验证在 控制面板 - >打开或关闭Windows功能 - >万维网服务 - >安全性 ...
- redis中key和value的存储大小限制
String类型:一个String类型的value最大可以存储512M List类型:list的元素个数最多为2^32-1个,也就是4294967295个. Set类型:元素个数最多为2^32-1个, ...
- 服务器推送(Server push)技术总结
1. 短轮询 ajax按一定间隔去请求 2. 长轮询(long Polling) Long Polling的实现很简单,可分为四个过程: 发起Polling发起Polling很简单,只需向服务器发起请 ...