Constructive Algorithms

CF1709C

CF1705D

算法 1

  • 取长度为 n − 1 n - 1 n−1 的串
    s ‾ = ( s 1 ⊕ s 2 ) ( s 2 ⊕ s 3 ) … ( s n − 1 ⊕ s n ) t ‾ = ( t 1 ⊕ t 2 ) ( t 2 ⊕ t 3 ) … ( t n − 1 ⊕ t n ) \begin{aligned}\overline s &= (s_1 \oplus s_2)(s_2 \oplus s_3)\dots(s_{n - 1}\oplus s_n) \\\overline t &= (t_1 \oplus t_2)( t_2 \oplus t_3)\dots(t_{n - 1}\oplus t_n) \\\end{aligned} st​=(s1​⊕s2​)(s2​⊕s3​)…(sn−1​⊕sn​)=(t1​⊕t2​)(t2​⊕t3​)…(tn−1​⊕tn​)​
  • 则原操作相当于每次选择一对相邻的 0 和 1 交换。
  • 记串 s ‾ \overline{s} s 中 1 的位置从小到大依次为 a 1 , a 2 , … , a p a_1, a_2, \dots, a_p a1​,a2​,…,ap​,串 t ‾ \overline{t} t 中 1 的位置从小到大依次为 b 1 , b 2 , … , b q b_1,b_2,\dots,b_q b1​,b2​,…,bq​,显然 p ≠ q p \neq q p=q 时无解,同时最少操作步数为 ∑ i = 1 p ∣ a i − b i ∣ \sum \limits_{i = 1}^{p}|a_i - b_i| i=1∑p​∣ai​−bi​∣。
  • Code

算法 2

  • 本质上与算法 1 相同。
  • 不难发现,每次操作只会让原串中连续的 1 (以下简称为连续段)伸长和缩短,但连续段数目保持不变,不同的连续段之间无法合并。
  • 因此贪心地将 s s s 中每个连续段移到 t t t 中对应连续段的位置即可。
  • Code

CF1338B

CF449C

CF1704E

CF1705F

Dynamic Programming

CF1348E

CF1511G

Greedy

CF1344D

算法 1

  • 令 f i ( x ) = x ( a i − x 2 ) f_i(x) = x(a_i - x^2) fi​(x)=x(ai​−x2)。
  • 如果没有和的限制,很容易求出最值位置 x i = a i 3 x_i = \sqrt \frac{a_i}{3} xi​=3ai​​ ​,令 b i b_i bi​ 取 f i ( ⌊ x i ⌋ ) f_i(\lfloor x_i \rfloor) fi​(⌊xi​⌋) 和 f i ( ⌈ x i ⌉ ) f_i(\lceil x_i \rceil) fi​(⌈xi​⌉) 中较大的位置即可。
  • 若 ∑ i = 1 n b i = k \sum \limits_{i = 1}^{n} b_i = k i=1∑n​bi​=k,则 ∑ i = 1 n b i ( a i − b i 2 ) \sum \limits_{i = 1}^n b_i (a_i - b_i^2) i=1∑n​bi​(ai​−bi2​) 最大可等价为下面的形式
    ∑ i = 1 n b i ( a i − b i 2 ) + C k = ∑ i = 1 n b i ( a i + C − b i 2 ) = ∑ i = 1 n g i ( b i ) \begin{aligned} &\sum \limits_{i = 1}^{n}b_i(a_i - b_i^2) + Ck \\ = &\sum\limits_{i = 1}^{n}b_i(a_i + C - b_i^2)\\ = &\sum\limits_{i = 1}^{n} g_i(b_i) \end{aligned} ==​i=1∑n​bi​(ai​−bi2​)+Cki=1∑n​bi​(ai​+C−bi2​)i=1∑n​gi​(bi​)​
  • 其中 g i ( x ) = x ( a i + C − x 2 ) , C ∈ R g_i(x) = x(a_i + C - x^2), C \in \mathbb R gi​(x)=x(ai​+C−x2),C∈R,其最值位置 x i x_i xi​ 满足
    • 当 a i + C ≥ 0 a_i + C \ge 0 ai​+C≥0 时, x i = min ⁡ { a i , a i + C 3 } x_i = \min\{a_i, \sqrt\frac{a_i + C}{3}\} xi​=min{ai​,3ai​+C​ ​}。
    • 当 a i + C < 0 a_i + C < 0 ai​+C<0 时, x i = 0 x_i = 0 xi​=0。
  • 用 Lagrange \text{Lagrange} Lagrange乘数法 也可以得到相同的结果。
  • 因此可以二分得到 C C C,恰使 ∑ i = 1 n x i = k \sum \limits_{i = 1}^{n}x_i = k i=1∑n​xi​=k。
  • 先令 b i = ⌊ x i ⌋ b_i = \lfloor x_i \rfloor bi​=⌊xi​⌋,然后将 b i b_i bi​ 按 Δ i = f i ( b i + 1 ) − f i ( b i ) \Delta_i = f_i(b_i + 1) - f_i(b_i) Δi​=fi​(bi​+1)−fi​(bi​) 从大到小排序,取前 k − ∑ i = 1 n b i k - \sum \limits_{i = 1}^{n}b_i k−i=1∑n​bi​ 个增加 1 即可。
  • 注意精度误差的处理。
  • Code

算法 2

  • 考虑一个暴力做法,初始时令所有 b i = 0 b_i = 0 bi​=0,用堆维护 Δ i \Delta_i Δi​(定义同上),每次取 Δ i \Delta_i Δi​ 最大的增加 1,共增加 k k k 次。
  • 不难发现每次取的 Δ i \Delta_i Δi​ 是单调不增的,因此我们可以二分最后一次取的 Δ i \Delta_i Δi​, b i b_i bi​ 可以通过解二元一次方程计算出来。
  • 因为每次取的 Δ i \Delta_i Δi​ 并非单调减,最终的 ∑ i = 1 n b i \sum \limits_{i = 1}^{n}b_i i=1∑n​bi​ 取值范围可能是一个区间,我们可以先二分得到一个 ∑ i = 1 n b i ≤ k \sum \limits_{i = 1}^{n}b_i \le k i=1∑n​bi​≤k 且最后取的 Δ i \Delta_i Δi​ 最大的解,剩下的处理方法同 算法 1
  • Code

CF1775E

算法 1

  • 将序列中的 0 直接删除,并将同符号的相邻数字合并,可得到一个正负号交替的序列。
  • 不难得到一种贪心的策略:
    • 取当前序列中绝对值最小的数的绝对值为 m x mx mx。
    • 将序列中每个数的绝对值减去 m x mx mx。
    • 此时序列会产生新的 0,删除 0 后需将之后出现的同符号相邻数字合并。
  • 可用链表维护这一序列,并通过 set 维护序列中的数的绝对值,将序列中每个数减去一个值可通过全局标记实现。
  • 由于每个数只会被删除一次,总时间复杂度 O ( n log ⁡ n ) \mathcal O(n\log n) O(nlogn),实现较为繁琐。
  • Code

算法 2

  • 取原序列的前缀和序列 b b b,此时原操作变为选择若干个位置,同时 +1/-1。
  • 显然答案为 max ⁡ { 0 , max ⁡ 1 ≤ i ≤ n { b i } } + max ⁡ { 0 , max ⁡ 1 ≤ i ≤ n { − b i } } \max\{0,\max\limits_{1 \le i \le n}\{b_i\}\} + \max\{0,\max\limits_{1 \le i \le n}\{-b_i\}\} max{0,1≤i≤nmax​{bi​}}+max{0,1≤i≤nmax​{−bi​}}。
  • Code

Codeforces Problemset相关推荐

  1. http://codeforces.com/problemset/problem/158/B Taxi

    s=4的肯定单独坐一辆. s=3需要与s=1的共同乘坐,可以想到s=3单独乘坐一辆并不是最优的,因为还空了一个位子,而这个空出来的位置只能由s=1的填进去,这样放显然是最优的因为s=1的如果不放进去以 ...

  2. CodeForces 375D Tree and Queries

    传送门:https://codeforces.com/problemset/problem/375/D 题意: 给你一颗有根树,树上每个节点都有其对应的颜色,有m次询问,每次问你以点v为父节点的子树内 ...

  3. codeforces水题100道 第二十七题 Codeforces Round #172 (Div. 2) A. Word Capitalization (strings)...

    题目链接:http://www.codeforces.com/problemset/problem/281/A 题意:将一个英文字母的首字母变成大写,然后输出. C++代码: #include < ...

  4. CodeForces 595A

    题目链接: http://codeforces.com/problemset/problem/595/A 题意: 一栋楼,有n层,每层有m户,每户有2个窗户,问这栋楼还有多少户没有睡觉(只要一个窗户灯 ...

  5. codeforces A. Jeff and Digits 解题报告

    题目链接:http://codeforces.com/problemset/problem/352/A 题目意思:给定一个只有0或5组成的序列,你要重新编排这个序列(当然你可以不取尽这些数字),使得这 ...

  6. [题解]RGB Substring (hard version)-前缀和(codeforces 1196D2)

    题目链接:https://codeforces.com/problemset/problem/1196/D2 题意: q 个询问,每个查询将给你一个由 n 个字符组成的字符串s,每个字符都是 &quo ...

  7. Codeforces 900D Unusual Sequences:记忆化搜索

    题目链接:http://codeforces.com/problemset/problem/900/D 题意: 给定x,y,问你有多少个数列a满足gcd(a[i]) = x 且 ∑(a[i]) = y ...

  8. Codeforces Round #539 (Div. 2) C. Sasha and a Bit of Relax

    链接:https://codeforces.com/problemset/problem/1113/C 题意:长度为n的序列 ,若l,r满足,则称这对l,r为funny,其中mid=(r-l+)/2 ...

  9. 【Codeforces】501B Misha and Changing Handles(map)

    http://codeforces.com/problemset/problem/501/B map的应用,让新的名字作为key值,旧的名字作为value值,然后一一对应.如果这个旧名字不在map里, ...

最新文章

  1. 极速理解设计模式系列:23.装饰器模式(Decorator Pattern)
  2. Keil 5出现Error: L6218E: Undefined symbol解决方法
  3. java 文本压缩_[Java基础]Java使用GZIP进行文本压缩
  4. 使用axios上传文件+参数
  5. cuba 平台_CUBA平台正在开源
  6. js--------1.时间
  7. .NET开源项目介绍及资源推荐:数据持久层
  8. PAT Basic 1012
  9. Java 报表工具选择
  10. (转)Y480 完美黑苹果全套驱动分享
  11. 渗透测试报告模板_渗透测试报告编写的几个小技巧
  12. juki贴片机是什么牌子,juki贴片机型号一览表
  13. 突破运营商 QoS 封锁,WireGuard 真有“一套”!
  14. 大数据周会-本周学习内容总结05
  15. 宝塔面板 - BT面板 Linux Centos 命令集
  16. java接口支持ajax,【JavaWeb】jQuery对Ajax的支持
  17. 各种肤质补水六大误区 - 健康程序员,至尚生活!
  18. 聚合签名、门限签名、Multisigs 和多签名
  19. 苹果CMS 10播放地址倒序排列
  20. 在Ubuntu 14.04下安装Pepper Flash

热门文章

  1. Hadoop3.2.1 【 YARN 】源码分析 : ContainerManager浅析
  2. 世界三大数学软件:MATLAB 2017-2019/Mathematica 11/Maple 2018-2019
  3. 解决:win10一开机,内存占用过高,有的达到70%的办法
  4. 智能合约--如何实现可升级的智能合约
  5. 0x80073712_win101903版本更新错误0x80073712的解决方法 - 系统家园
  6. (2023)CUDA11.7+Python3.9+Pytorch GPU安装
  7. Java 学习笔记 - AutoCloseable、Closeable
  8. 几种mos管驱动电路
  9. Web 服务寻址(WS-Addressing)对 SOAP 的隐式影响
  10. 软件设计师(软考中级)考试大纲