CF选做

多动动脑子吧
已经完成了:

9

题目难度主要在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 Lmin(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的情况就好了

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值