多动动脑子吧
已经完成了:
题目难度主要在1900-2500
题目
CF1220D 1900
想法题,考虑两个是奇数的话肯定可以,一个奇数一个偶数肯定不可以,两个偶数同时除2就好
统计一个long long的数后面0的个数,可以用__builtin_ctzll(x)
CF1219G 2000
分五种情况讨论,如果行的情况是0/4时,可以直接 O ( N ) 和 O ( M ) O(N)和O(M) O(N)和O(M)搞,然后1/3的时候,就枚举那一行,时间复杂度是 O ( N M ) O(NM) O(NM),2/2的话时间复杂都就是 O ( m i n ( n , m ) 2 m a x ( n , m ) ) O(min(n,m)^2max(n,m)) O(min(n,m)2max(n,m))了,每次只用统计前4大,不用排序,直接开四个数存即可,所以扫是 O ( N ) O(N) O(N)的
CF1220E 2200
其实与1相连的所有的环都可以算上,然后在所有的环外其他的点选一条链连进来就行(所有的环都能算到)
考虑把度数为1的点塞进队列里,遇到环就停即可
CF1221F 2500
假设你选的矩阵的左下角和右下角,分别为 ( L , R ) (L,R) (L,R) ,那么一个点 ( x , y ) (x,y) (x,y)被包含的充要条件是
L ≤ m i n ( x , y ) ≤ m a x ( x , y ) ≤ R L \leq min(x,y) \leq max(x,y) \leq R L≤min(x,y)≤max(x,y)≤R
然后就是一个区间有值问题,左端点排序,右端点线段树或树状数组即可
CF1230E 2100
考虑到每条链最多也就 l o g 1 0 12 log 10^{12} log1012这么多个值,所以我从树的上面做到下面就可以了,每个点维护一个map转移
CF1218E 2500
把选了K个的答案用F[K]来表示,然后用线段树分治,最后每次两个子孩子NTT一下
时间复杂度是 O ( n l o g 2 n ) O(nlog^2n) O(nlog2n)
CF1231E 2000
结论:找出T最长的字串是S的子序列
证明:假设把操作反过来,变成是T里面找一个开头或结尾的字母插进串内,这样结论就很显然
正着想也可以,发现只要是子序列一定有办法合并成字串,不是子序列中的字母也可以某种顺序一次调整到别的位置
CF1234F 2400
就是找两段连续的字母都不相同的拼在一起,然后我们把每种字母状态压位,就可以用 O ( n 2 n ) O(n2^n) O(n2n)的时间来处理 m a x ( d p [ i ] + d p [ j ] ) max(dp[i] + dp[j]) max(dp[i]+dp[j])其中i和j每个位都不相同的。
for(int i=0;i<(1<<20)-1;i++)for(int j=0;j<20;j++) if(!(i&(1<<j))) dp[i|(1<<j)] = max(dp[i|(1<<j)] , dp[i]);int ans = 0;for(int i=0;i<(1<<20);i++) ans = max(ans , dp[i] + dp[((1<<20)-1) ^ i]);
CF1238D 1800
只用考虑一个字母或者ABBBBB BAAAAA的情况就好了