ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Codeforces 1329 题解

2020-04-27 19:00:43  阅读:298  来源: 互联网

标签:lfloor lceil 元素 frac 题解 复杂度 1329 Codeforces rceil


A

先构造最左方案,然后能调整尽量调整即可。
时间复杂度 \(O(m)\).
代码: 75367082

B

显然每个二进制位是独立的,且只能有 \(0\) 个或 \(1\) 个数在该位上有值。乘起来即可。
时间复杂度 \(O(\log n)\).
代码: 75373134

C

贪心。每次删去能删的尽量大的(不亏)。
比较好的实现方法是定义一个 solve(u) 函数,先不停地删 \(u\) 点直到删不下去为止,然后再递归 solve(u<<1),solve(u<<1|1). 没有必要比较大小,因为每个子树内删的个数是固定的。
时间复杂度 \(O(2^hh)\).
代码: 78094188

D

对于每一对相邻相等的元素,我们在中间画一条线,并定义线的值等于相等元素的值。于是就得到了一个新的序列,操作等价于:在新的序列上选择相邻两个元素,如果不等则一起删去,相等则留下一个。也就相当于尽量多删不等的。
不难发现最优策略:当不存在一个元素出现次数严格超过一半时一定可以一直删不同直到只剩下一个元素,否则可以让每个其他元素都和这个元素配对。策略就是如果还剩下两种或更多则取出现次数最多的和它任意一个相邻的删,否则就删相同的。
难点是如何实现:要对每个字符维护一个集合,集合中的每个元素是一个二元组,表示一对相邻不同的位置,且其中一个是该字符。使用 set 即可。
最后还要求输出方案,要找到在当前序列中的位置,树状数组+并查集维护哪些点还没被选即可。
时间复杂度 \(O(n|\Sigma|+n\log n)\).
代码: 78207027

E

首先稍微转化一下:有 \(m\) 个数 \(a_i\),找出一个序列 \(b_i\) 满足 \(\sum^m_{i=1}b_i=K\) (\(m,K\) 实际为输入的 \(m+1,K+m+1\)),对每个 \(i\) 找出 \(b_i\) 个正整数和为 \(a_i\),最小化所有找出的数的极差。
不难发现对于一个 \(i\) 最优策略一定是分配得尽量平均,即 \(b_i-a_i\mod b_i\) 个 \(\lfloor\frac{a_i}{b_i}\rfloor\) 和 \(a_i\mod b_i\) 个 \(\lceil\frac{a_i}{b_i}\rceil\). 于是就是要最小化 \(\max^m_{i=1}\lceil\frac{a_i}{b_i}\rceil-\min^m_{i=1}\lfloor\frac{a_i}{b_i}\rfloor\).
考虑求出两个值:\(R\) 表示 \(\max\) 部分的最小可能值是多少,\(L\) 表示 \(\min\) 部分的最大可能值是多少。这个容易直接二分得到。
可以发现如果对于每个 \(i\) 都存在 \(b_i\) 满足 \(L\le\lfloor\frac{a_i}{b_i}\rfloor\le\lceil\frac{a_i}{b_i}\rceil\le R\) 则一定可以在 \(L\) 和 \(R\) 的方案基础上进行调整得到总个数恰好为 \(K\) 的方案。即这种情况下答案为 \(R-L\).
但是有可能存在一些 \(i\) 不存在合法的 \(b_i\). 这时候我们求出最接近 \([L,R]\) 的 \(b_i\),即满足 \(\lfloor\frac{a_i}{x}\rfloor\lt L\) 的最小的 \(x\) 和满足 \(\lceil\frac{a_i}{y}\rceil\gt R\) 的最小的 \(y\). 我们令 \(a_i\) 的贡献(就是参与到 \(\max\) 和 \(\min\) 的计算中的值)为 \(x\) 和 \(y\) 中的一者(显然它不可能同时成为 \(\max\) 和 \(\min\),因为它不可能既 \(\gt R\) 又 \(\lt L\)),那么和上面同理可证一定能调整得到一个合法方案。
于是我们的问题就转化为,有一个集合,初始时只有 \(L,R\) 两个数,现在有 \(n\) 个二元组,要从每个中挑出一个加入集合,最小化集合内的极差。直接先默认全选小的,然后从小到大每次把最小的改成选大的即可。
时间复杂度 \(O(m\log m+m\log n)\).
代码: 78272837

标签:lfloor,lceil,元素,frac,题解,复杂度,1329,Codeforces,rceil
来源: https://www.cnblogs.com/suncongbo/p/12789094.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有