【codeforces】

1800

B. Missing Subsequence Sum

题意:构造一个长度不超过 25 的序列,保证任意子集的和的集合为 { x ∣ 1 ≤ x < k   a n d   k < x ≤ n } \{x|1\leq x<k ~and ~ k<x\leq n\} {x∣1x<k and k<xn}

【不会解决空缺的问题,看了题解】

思路:容易想到先构造 [ 1 , k ) [1,k) [1,k) 的。接下来塞入 k + 1 k+1 k+1 ,这样会形成类似 [ 1 , 2 , ⋯   , k − 1 ] ( k ) [ k + 1 , ⋯   , 2 k ] , [ 2 k + 1 , ⋯   , 2 k + k ] ( 2 k + k + 1 ) [ . . . ] [1,2,\cdots ,k-1](k)[k+1, \cdots,2k],[2k+1, \cdots,2k+k](2k+k+1)[...] [1,2,,k1](k)[k+1,,2k],[2k+1,,2k+k](2k+k+1)[...] 。此时注意到空缺需要填充,我们可以添加一个 2k ,这样第一个空缺可以由 ( k + 1 ) + ( 2 k ) (k+1)+(2k) (k+1)+(2k) 来填充。

AC代码:https://codeforces.com/contest/1965/submission/269581726


1900

A2. Dual (Hard Version)

题解:CF1854A2 Dual (Hard Version) 题解

【没想到贪心】

思路:

首先观察到性质:非负序列做一遍前缀和即可,非正序列后缀和。我们即想要把序列的负数变成非负数(或正数变成非整数),然后做 n-1 次即可。

接下来是没有想到的 贪心 解法。找到绝对值最大的,然后加到符合相反的上面。这样的话,如果符号相反的数量 <= 12 时可以解决。但是 >= 13 时会超出限制,此时让符号相反的数字指数级增长,反过来操作即可。

AC代码:https://codeforces.com/contest/1854/submission/269658343


2000

C. Another Array Problem

【没观察出性质】

思路:需要注意到性质:对同一区间操作两次,即可变为 0 ,紧接着容易操作为所有数字都为 max(a) ,答案即为 n*max(a) 。

只有 n ≥ 4 n\geq 4 n4 时总存在 0 区间使得最大值防止被平摊。当 n ≤ 3 n\leq 3 n3 时讨论即可。

AC代码:https://codeforces.com/contest/1763/submission/269739028


1900

D. K-good

【注意力不足】

题解:CF1656D题解

思路:首先推公式,题意可转化为:求一对奇偶数,满足两数乘积为 2n,且较小的那个数 >= 2。

然后发现 2 这个因子 只在偶数 里,然后 log 分解一下,分类讨论。

AC代码:https://codeforces.com/contest/1656/submission/271390105


D. Funny Game

思路:

【注意力不足】

首先,要想到 x   ∣   ∣ a u − a v ∣ x~|~|a_u-a_v| x  auav 这个条件拆开 ,不然容易往 n 2 n^2 n2 方面思考。拆开后是 a u ≡ a v (   m o d     x ) a_u \equiv a_v (\bmod~ x) auav(mod x) ,这时发现根据 鸽巢原理 ,对于 x ∈ [ 1 , n − 1 ] x\in [1, n-1] x[1,n1] ,总有一对 ( u , v ) (u,v) (u,v) 同余,考虑优先满足 x = n − 1 x=n-1 x=n1 。然后发现连通块数量会 少一,此时对每个连通块钦定一点,这 n − 1 n-1 n1 个点对于 x = n − 2 x=n-2 x=n2 仍然会有两个点同余,仍然可以连边。以此类推。

AC代码:https://codeforces.com/contest/1994/submission/271384248


E. Wooden Game

思路:考虑一棵树贡献的值域 。我们每次删除叶子节点,就能够取到值域 [ 1 , n ] [1, n] [1,n] 中的任一个值,是否还会有 > n >n >n 的取法?根据 a  or  b ≤ a + b a ~\text{or}~b \leq a+b a or ba+b ,易知上界为 n n n

题目转化为,给出序列 n 1 , n 2 , ⋯   , n k n_1, n_2, \cdots, n_k n1,n2,,nk ,求 OR  i = 1 n v i ( 1 ≤ v i ≤ n i ) \text{OR }_{i=1}^n{v_i}(1\leq v_i\leq n_i) OR i=1nvi(1vini) 的最大值。按位贪心。

AC代码:https://codeforces.com/contest/1994/submission/271385527


2000

D. GCD and MST

思路:先考虑枚举左端点,根据 gcd 有 log 种的特性,推理出一个点向右 总是有 log 个区间有边连接,但是接下来推不动了。

考虑从小到大贪心枚举 a i a_i ai ,包含 a i a_i ai gcd ⁡ = min ⁡ \gcd=\min gcd=min 的区间的特性是什么呢?那就是区间每个数都是 a i a_i ai 的倍数。由此,枚举 a i a_i ai 后,可以向左向右拓展是 a i a_i ai 的倍数的点连边。

维护连通性的话,刚开始没处理好,其实可以用 v i v_i vi 表示 i → i + 1 i\rightarrow i+1 ii+1 有边。代码用了并查集。

AC代码:https://codeforces.com/contest/1513/submission/271478095


1800

B. Range and Partition

思路:在 [ x , y ] [x, y] [x,y] 内的 a i a_i ai 映射为 1,否则为 -1 。一段内需满足 c n t ( 1 ) ≥ c n t ( − 1 ) + 1 cnt(1)\geq cnt(-1)+1 cnt(1)cnt(1)+1 ,叠加即 ∑ c n t ( 1 ) ≥ ∑ c n t ( − 1 ) + k \sum cnt(1)\geq \sum cnt(-1)+k cnt(1)cnt(1)+k 。二分或滑窗即可。

AC代码:https://codeforces.com/contest/1630/submission/271484141


1900

C. Three Bags

思路:贪心。一种方案为 ( + , + , ⋯   ) , ( − , − ⋯   ) , ( + , + , ⋯   ) (+,+,\cdots),(-,-\cdots),(+,+,\cdots) (+,+,),(,),(+,+,) ,考虑转移为其他方案,我们可以交换两个集合内的正负,即 ( + , + , ⋯   ) , ( + , − , − ⋯   ) , ( − , + , + , ⋯   ) (+,+,\cdots),(+,-,-\cdots),(-,+,+,\cdots) (+,+,),(+,,),(,+,+,) ,这样不是最优的,第三个集合出现负号后,可以把第二个集合的负号转移为+(要余下一个),即 ( + , + , ⋯   ) , ( − , + , + ⋯   ) , ( − , + , + , ⋯   ) (+,+,\cdots),(-,+,+\cdots),(-,+,+,\cdots) (+,+,),(,+,+),(,+,+,)

AC代码:https://codeforces.com/contest/1467/submission/271502228

https://codeforces.com/contest/1467/submission/271505452


2000

D. Buying Jewels

思路:首先找性质。手动模拟枚举 p p p ,发现当 p ≥ n − ( ⌈ n 2 ⌉ − 1 ) p \geq n - (\lceil \frac n 2 \rceil - 1) pn(⌈2n1) 时,我们可以取到 [ 1 , ⌈ n 2 ⌉ ] [1, \lceil \frac n 2 \rceil] [1,2n⌉] 个商品中的任意一个,即店铺设为 p p p 并只买一个商品,然后多余的继续递推,直到 n = k n=k n=k 时让 p = 1 p=1 p=1 。当 p p p 更小的情况呢?手摸没摸出来,我认为上界是根号级别的,是上面值域的子集,所以不考虑。

写的时候 wa2,发现是考虑的不全,当 p = 1 p=1 p=1 时可以取到 n n n 个,所以正确值域应该是 [ 1 , ⌈ n 2 ⌉ ] ∩ { n } [1, \lceil \frac n 2 \rceil] \cap\{ n \} [1,2n⌉]{n}

AC代码:https://codeforces.com/contest/1951/submission/271531872

  • 13
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值