概况
完成 cf 难度总和: 2000 + 2300 + 2000 + 2300 + 1200 + 2000 + 2800 + 2400 + 1800 + 2200 = 21000 2000+2300+2000+2300+1200+2000+2800+2400+1800+2200=21000 2000+2300+2000+2300+1200+2000+2800+2400+1800+2200=21000
被 wyq ≈ 20000 ≈ 20000 ≈20000 吊打
简要题解
CF920F
简单ds题,方法和区间开平方根差不多。每个数进行不了几次操作。于是我们维护区间和和区间 max \max max。如果区间 max ≤ 2 \max\leq 2 max≤2 那么不用修改了。并且我们只要 O ( x ln x ) O(x\ln x) O(xlnx) 预处理 d ( x ) d(x) d(x) 即可
CF785D
首先我们考虑对于每个 (
分别计算贡献,假设这之前有 n n n 个 (
后面有 m m m 个)
,那么对于这个 (
的贡献即为 ∑ i = 1 min ( n , m ) C n − 1 i − 1 × C m i \sum\limits_{i=1}^{\min(n,m)}C_{n-1}^{i-1}\times C_{m}^{i} i=1∑min(n,m)Cn−1i−1×Cmi。然后通过看题解知道这个等效于 C n + m − 1 n C_{n+m-1}^{n} Cn+m−1n。
CF353D
这道题目的思想和 CF622E 挺像的。我们考虑设 f i f_i fi 表示到第 i i i 个人最少需要交换几次(保证前 i i i 个操作完已经排列完成)。于是 f i = max ( f i − 1 + [ i − l a ≤ g s − 1 ] , i − g s ) f_i=\max(f_{i-1}+[i-la\leq gs-1],i-gs) fi=max(fi−1+[i−la≤gs−1],i−gs),其中 l a la la 表示上个 F
出现的位置, g s gs gs 表示当前有 F
的个数。时间复杂度 O ( n ) O(n) O(n)
CF79D
这道题目想到了还挺好写的。我们考虑异或差分,假设 n n n 个灯泡的状态为 1011
那么差分后即为 11101
。于是假设我们翻转 [ l , r ] [l,r] [l,r] 这段区间相当于差分数组的 c f l cf_{l} cfl 和 c f r + 1 cf_{r+1} cfr+1 进行去翻即可。
差分数组 1
的个数肯定 ≤ 20 \leq 20 ≤20。于是我们考虑状压dp。设 f i f_i fi 表示到达状态 i i i 的最少操作数,状态 i i i 若第 j j j 位为 1 1 1 相当于把第 j j j 盏灯打开的最小次数。转移很简单 f i = min A ∈ i , B ∈ i ( f i ⊕ A ⊕ B + g A , B ) f_{i}=\min\limits_{A∈i,B∈i}(f_{i\oplus A\oplus B}+g_{A,B}) fi=A∈i,B∈imin(fi⊕A⊕B+gA,B), g i , j g_{i,j} gi,j 表示 [ i , j ] [i,j] [i,j] 区间除了 i , j i,j i,j 改变状态其余不改变状态的最小次数。这个可以用 bfs 预处理。
CF1369E
我们考虑每个人都全选,如果还存在一种食物没被吃完那么有这个物品的人肯定不会吃 Leo 。于是我们把拥有那些食物的人放到最后即可,对他要求的另一个菜补回来,不停地操作相同的操作直到没有菜为止。
CF590C
01bfs模板题,由于只有 3 个种国家。我们于是记 d k = [ 1 / 2 / 3 ] , i , j d_{k=[1/2/3],i,j} dk=[1/2/3],i,j 表示 k k k 国度到第 ( i , j ) (i,j) (i,j) 最短距离。那么答案即 min i , j ( d 0 , i , j + d 1 , i , j + d 2 , i , j − 2 × [ a i , j = \min_{i,j}(d_{0,i,j}+d_{1,i,j}+d_{2,i,j}-2\times[a_{i,j}= mini,j(d0,i,j+d1,i,j+d2,i,j−2×[ai,j=.
] ) ]) ])。
01bfs 一般处理边权 [ 0 , 1 ] [0,1] [0,1] 的 bfs。每次取队首元素,对于每次能松弛的操作如果为同一个 level 把他放到队首否则放到队尾。