Codeforces Round #716 A~D

codeforces #716 A~D
by CarolusRex

A. Perfectly Imperfect Array

点点点

B. AND 0, Sum Big

点点点

C. Product 1 Modulo N

题意:
找到 { 1 , 2 , . . . , n − 1 } \{1,2,...,n-1\} {1,2,...,n1}的最长子序列,使得序列的乘积 % n = 1 \% n = 1 %n=1

题解:
构造法
显然选取的数应该与 n n n互质,选取这些数,其乘积即为 p p p,那么在 p ≠ 1 p \neq 1 p=1时,去除 p p p即可。

D. Cut and Stick

题意:
给定一组数 n ( 1 ⩽ n ⩽ 3 ⋅ 1 0 5 ) n\left(1\leqslant n\leqslant 3\cdot10^5\right) n(1n3105),在给定区间内划分子序列,使得每个子序列中出现次数最多的数的数量小于等于 ⌈ x 2 ⌉ \lceil \frac{x}{2} \rceil 2x,其中 x x x为该子序列长度。求每个询问 q ( 1 ⩽ n ⩽ 3 ⋅ 1 0 5 ) q\left(1\leqslant n\leqslant 3\cdot10^5\right) q(1n3105)区间 [ L , R ] [L,R] [L,R]的最小划分子序列数量。

题解:
区间长度已给定,且是子序列,那么我们只需要找到该区间内出现次数最多数的数量,记长度为 l e n len len,数量为 n u m num num,划分次数为 k k k,那么只需要满足 n u m − k + 1 ⩽ ⌈ l e n − k + 1 2 ⌉ num - k + 1 \leqslant \lceil \frac{len - k + 1}{2} \rceil numk+12lenk+1,这可以用二分找到最小k。时间复杂度为 O ( l o g n ) O(logn) O(logn)
而区间内出现最多次数可以用莫队解决。需要注意的是,我们用莫队维护的是最大值,那么减操作是不可行的。一个技巧是先维护 ( u n i t , R ] (unit, R] (unit,R]的数量,再遍历 [ L , u n i t ] [L, unit] [L,unit]。时间复杂度为 O ( n n ) O(n\sqrt{n}) O(nn )

在Tutorial中,提出了对 ⌈ x 2 ⌉ \lceil \frac{x}{2} \rceil 2x的特定优化问题,然而我没想出来,等一个神犇。

code

https://github.com/cfuser/codeforces

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值