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∣1≤x<k and k<x≤n}
【不会解决空缺的问题,看了题解】
思路:容易想到先构造 [ 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,⋯,k−1](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 n≥4 时总存在 0 区间使得最大值防止被平摊。当 n ≤ 3 n\leq 3 n≤3 时讨论即可。
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 ∣ ∣au−av∣ 这个条件拆开 ,不然容易往 n 2 n^2 n2 方面思考。拆开后是 a u ≡ a v ( m o d x ) a_u \equiv a_v (\bmod~ x) au≡av(mod x) ,这时发现根据 鸽巢原理 ,对于 x ∈ [ 1 , n − 1 ] x\in [1, n-1] x∈[1,n−1] ,总有一对 ( u , v ) (u,v) (u,v) 同余,考虑优先满足 x = n − 1 x=n-1 x=n−1 。然后发现连通块数量会 少一,此时对每个连通块钦定一点,这 n − 1 n-1 n−1 个点对于 x = n − 2 x=n-2 x=n−2 仍然会有两个点同余,仍然可以连边。以此类推。
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 b≤a+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(1≤vi≤ni) 的最大值。按位贪心。
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 i→i+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) p≥n−(⌈2n⌉−1) 时,我们可以取到 [ 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