Codeforces Round 998 (Div. 3) 部分题解

写题解的时候这场在评测,就不放代码了。

又是被 div3 薄纱的一天!

E. Graph Composition

题意

给两个无向简单图,对图 1 添加若干条边或删除若干条边,使得两图的连通性一致,最少需要变更多少条边。

题解

求出图 2 的连通性,考虑图 1 的所有边,若违背了图 2 联通性的要删除(图 2 不联通但图 1 联通的)。

接着求图 1 剩下边的连通性,对于图 2 的每条边,若违背图 1 连通性则要加这条边(图 1 不联通但图 2 连通)。

用并查集实现。

F. Multiplicative Arrays

题意

给定 n,k ,对每个 1xk,求出多少个序列 a 使得:

  • |a|n,1aik
  • ai=x

n9×108

题解

fx,k 表示将 x 分解成 i 个有序的大于 1 的数的乘积的方案数,由于最多只能分解出 log(x) 个这样的数,可以直接递推。

计算方案数,需要填充 1 在剩余位置,枚举 a 的大小是多少,对于一个拆分个数 m ,其总方案数为:

(mm)+(m+1m)+...+(nm)=(n+1m+1)

由于 m 很小最多 log(x) 级别,可以暴力求组合数(逆元也是暴力求),复杂度为 klog3(k) ,需要卡卡常。

G. Bugged Sort

参考了官方题解,不会啊咋办 😦

题意

给定两组序列,长度都是 n ,两组序列的数两两不同,一次操作为选择 ij ,交换 ai,bj,交换 aj,bi

能否在若干次操作后使 a,b 均升序排序。

题解

首先观察到:一次操作后, ai,bi 是绑定的,不会分开,我们称这是一对数。

一次操作实际上是将一对数交换,再分别翻转。能否在不翻转的情况下交换一对数?

答案是可以的,对于 i,j ,额外选定一个位置 k ,进行操作 (i,k),(i,j),(j,k) ,就能做到。同理,也能做到不交换两对数只翻转两对数,但不能做到只翻转一对数。

再观察性质,两对数中,若 min(ai,bi)<min(aj,bj) ,那第 i 对一定得排在第 j 对前面,否则一定不能达成目标。由于两组序列上的数两两不同,这个排序方案是唯一的。根据上面的性质,可以在不翻转的情况下将每对数排序。

现在考虑翻转的问题,我们需要确定偶数个位置,将这些位置翻转,达成目标,设 fi,0/1,0/1 表示满足前 i 个数,一共翻转了奇数个或偶数个位置,i 位置有没有翻转,能不能达成,转移是容易的。

posted @   蒻蒻虫  阅读(104)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示