【4.10】Codeforces 刷题

B. Nastia and a Good Array

题意:给定一个长度为 n n n 的正整数序列 a a a。现在要对 a a a 进行操作。每一步操作可以任意选取两个整数 i i i j j j ( i ≠ j ) (i \neq j) (i=j) ,再任意取两个满足
m i n ( a i , a j ) = m i n ( x , y ) min(a_i,a_j)=min(x,y) min(ai,aj)=min(x,y) 的数 x x x y y y,然后把 a i a_i ai 换成 x x x a j a_j aj 换成 y y y

求使得对于 1 < i ≤ n 11<in 都满足 a i a_i ai a i − 1 a_{i-1} ai1 互质所需的最小操作次数以及操作方案。

思路:思考后发现性质:可以利用最小值 x x x 使得其他值 y y y 转化为大于等于 x x x 的任意数。那么可以使得 y y y 变为 x x x x + 1 x+1 x+1 ,使得是序列交替的 x , x + 1 x,x+1 x,x+1,因为相邻的整数都互质,即可满足题意。

AC代码:https://codeforces.com/contest/1521/submission/153254165


D. Game With Array

题意:给出两个数 N , S N,S N,S,问是否可以找到一个正序列和一个数 K ( 0 < = K < = S ) K(0<=K<=S) K(0<=K<=S) ,满足:存在一个长度为 N N N ,和为 S S S 的序列,在其中找不到一个子段的和为 K K K 或者 S − K S-K SK

如果存在构造,输出 YES 以及找到的序列还有 K K K
否则,输出 NO。

题解:CF1355D Game With Array 题解

思路:看的题解。证明不会。

AC代码:https://codeforces.com/contest/1355/submission/153285482


D. Non-zero Segments

题意:可以在给定序列中任意位置插入任意大的数,问最少插入多少个数使得序列不存在和为 0 的子区间。

思路:转化为前缀和也就是:问最少插入多少个数使得任意两两相同的元素之间都有插入的元素。我们枚举右端点,观察数字相同的左端点,发现可能有很多个左端点,但是只需要拆掉最近的左端点即可,其他左端点也会被拆掉。转化为经典的贪心:区间选点问题。

AC代码:https://codeforces.com/contest/1426/submission/153255511


C. Game with Chips

题意:见 洛谷 翻译。

思路:先缩到一个点,再遍历即可。

AC代码:https://codeforces.com/contest/1327/submission/153279060


D. Soldier and Number Game

题意:给你 a , b ( 1 < = b < = a < = 5000000 ) a,b(1<=b<=a<=5000000) a,b(1<=b<=a<=5000000) 表示你有一个数 a ! b ! \frac {a!}{b!} b!a!,你每次可以对 这个数除以 x ( x > 1 x(x>1 x(x>1 x x x 为这个数的因子)。 问你最多可以操作多少次使这个数变成 1。

思路:板子题,阶乘的质因数分解。有两种方法:

  1. 欧拉筛筛出 1 1 1 ~ 5000000 5000000 5000000 每个数的质因子个数,然后前缀和即可。( O ( n ) O(n) O(n) 预处理 O ( 1 ) O(1) O(1) 查询)
  2. n ! n! n! 的质因子个数,详见 AcWing 197. 阶乘分解题解 。( O ( n ) O(n) O(n) 查询)。这个方法用来求阶乘某个质因子的次数还差不多,可以做到 O ( log ⁡ n ) O(\log n) O(logn) ,暴力的话是 O ( n × s q r t ( n ) ) O(n \times sqrt(n)) O(n×sqrt(n))

AC代码:https://codeforces.com/contest/546/submission/153274619

你可能感兴趣的:(算法)