- UPD1.0:2018.11.28
- UPD2.0:2018.11.29
- UPD3.0:2018.12.01
原则:有div1就做div1,否则div2,div3通常基本不做。
- 【CFRD#524】 6/6
- 【CFRD#523】0/6
- 【CFRD#522】4/5
- 【CFRD#521】7/7
- 【CFRD#520】6/6
- 【CFRD#518】4/5
- 【CFRD#517】div1[4/5]-div2[6/6]
- 【CFRD#516】6/6
- 【CFRD#514】5/5
- 【CFRD#513】5/8
- 【CFRD#508】5/6
- 【CFERD#48】5/7
- 【CFRD#498div3】1/6
后期逐步更新,有空的话就写写每套我做了的题目大意和题解,会同步放到这里。尽量做到不咕咕咕
还需深入理解和有其它更优秀的做法还未写的题:
CFRD513:{
- A:枚举用多少个8组成号码,剩下的数字看看除以10可不可以组成即可。
- B:贪心,第一个选最大的999999…,另外一个选 n − n- n−这个数即可。
- C:枚举 H H H为矩阵有多高,选一个最小的 ∑ i = 1 n − H s u m a i { i ∼ i + H − 1 } \sum_{i=1}^{n-H}sum_{a_i}\{i\sim i+H-1\} ∑i=1n−Hsumai{i∼i+H−1},然后再扫一遍宽度即可,复杂度 O ( n m ) O(nm) O(nm)
- D:摆放位置没有影响,所以将 L [ i ] , R [ i ] L[i],R[i] L[i],R[i]分别排序后,对于每一个选 m a x { L [ i ] , R [ i ] } max\{L[i],R[i]\} max{L[i],R[i]},最后答案为 n + ∑ i = 1 n m a x ( L [ i ] , R [ i ] ) n+\sum_{i=1}^n{max(L[i],R[i])} n+∑i=1nmax(L[i],R[i]),复杂度 O ( n l o g n ) O(nlogn) O(nlogn)
- E:可以发现每两个点的最短距离变为原来的二分之一向下取整,但是原长为 1 1 1的还是 1 1 1,所以先算总的除以二,再加上原长为1的即可,复杂度 O ( n ) O(n) O(n)
- FGH:不会,QAQ
}
CFRD514 :{
- A:模拟题意即可。
- B: O ( n m ) O(nm) O(nm)扫一遍覆盖即可。
- C:因为是全排列,贪心,每次删除剩余序列的奇数位置的数即可,因为每次可以删掉一半,复杂度 O ( n ) ∼ O ( n l o g n ) O(n)\sim O(nlogn) O(n)∼O(nlogn)。
- D:先判断有无解,二分半径r,然后每次 O ( n ) O(n) O(n)求距离x轴距离为r的那条线与所有点为圆心的半径r的在线段上的交集,有交集则可行,否则不可行,复杂度 O ( n l o g n ) O(nlogn) O(nlogn)。
- E:按照bfs序,从叶子节点贪心往上合并即可。
}
CFRD516:{
- D:分段求取做法,n小于2e6枚举答案,2e6的复杂度, n > 2 e 6 n>2e6 n>2e6枚举转了多少轮 k / n k/n k/n的复杂度。
- E:置换贪心构造的方法,一开始对应就直接输出 n n n,否则一定可以构造到 n − 1 n-1 n−1,随便舍弃一个,以那一个位置为置换的空位置换即可。
- F:hash+暴力可以 O ( n n × h a s h ) O(n\sqrt{n}\times hash) O(nn×hash)卡过去,因为答案不超过1000,正解为后缀数组或者sam求lcp,线段树维护,dp转移,复杂度 O ( n l o g n ) O(nlogn) O(nlogn),目前没写后面的这种做法【推荐大佬blog】。
}
CFRD517 :{
- A:枚举能看的最大的页数,从后往前贪心枚举分配给第一天和第二天即可。
- B:贪心+DP,维护尽量需要放‘a’少的路径
- C:大区间每次贪心翻转3个,小区间二进制暴力枚举
- D:预处理质数因子的幂的排列,并hash,flyod贪心跑最小操作次数,每次枚举将其变成因子的幂的情况。假如 v = ∏ p i a i v=\prod p_i^{a_i} v=∏piai,那么 v v v的因子个数为 ∏ ( a i + 1 ) \prod (a_i+1) ∏(ai+1),所以只有因子的幂次数才影响因子个数。
}
CFRD518:{
-
A:设置 d p [ 0 / 1 / 2 ] [ i ] [ j ] dp[0/1/2][i][j] dp[0/1/2][i][j]表示当前在第 i i i个数字,值为 j j j,与前面一个相等,小于,大于的答案,转移用前缀和优化,复杂度为 200 × n 200\times n 200×n,发现等于的一维可以和大于或者小于的一维合并,再加滚动数组,可以优化到 d p [ 0 / 1 ] [ 0 / 1 ] [ j ] dp[0/1][0/1][j] dp[0/1][0/1][j]
-
B:直接拓扑排序判断,每次拿出度数为1的点,要判断除了第一层,每层的每个点有3个及其以上的儿子数,最后一层为k且只有一个点。
-
C:贪心构造,如 ( 0 , 0 ) , ( 1 , 0 ) , ( 1 , 3 ) , ( 2 , 0 ) , ( 3 , 0 ) , ( 3 , 3 ) , ( 4 , 0 ) , ( 5 , 0 ) , ( 5 , 3 ) ⋯ (0,0),(1,0),(1,3),(2,0),(3,0),(3,3),(4,0),(5,0),(5,3)\cdots (0,0),(1,0),(1,3),(2,0),(3,0),(3,3),(4,0),(5,0),(5,3)⋯,因为这样每层减少4个,而开始有几层是减少不到4个人,所以期望为 n 2 9 \frac{n^2}{9} 9n2个的。
-
D:首先找到 a i p i a_ip_i aipi最大,然后 b i p i b_ip_i bipi最大一直用的贪心会WA在105组数据,所以正解是凸包斜率优化dp+(矩阵优化或者等比数列求和)【推荐大佬blog】。
-
E:神仙题,不会,要用行列式和矩阵之类的东西,但是最后可以转化为求这颗树上的期望最大匹配数,用 d p [ 0 / 1 ] [ i ] dp[0/1][i] dp[0/1][i]表示以 i i i为根的子树, i i i匹不匹配的期望最大匹配数,然后 O ( n ) O(n) O(n)的树形DP即可。
}
CFRD520 :{
- A:贪心找一个最长的连续的即可。
- B:最后肯定是将每一个质因子的次数变为1为最优答案,操作次数就是找出最大的一个质因子幂的次数, l o g 2 log_2 log2这个次数向上取整就是答案(因为每次开根,幂是除以2的)。
- C:贪心先吃1,然后再吃0,维护一个2的幂次的前缀和,推推式子,每次就可以 O ( 1 ) O(1) O(1)的回答了。
- D:求一个最大欧拉回路,其实就是每个数和它的倍数都有正负,所以可以 4 × v a l 4\times val 4×val的值,暴力枚举一下倍数,复杂度为调和级数。
- E:每次都只删除当前区间在dfs序里面最左边或者最右边的一个点是最优的,所以线段树维护dfs序在原区间的最大最小值,再维护个区间lca就可以了
- F:拓扑排序两次,一次正向,一次反向,所以建两个图,找到一个点可以到它的和它可以到的点数,点数大于等于 n − 2 n-2 n−2的才是重要或者次重要点(细节很多要注意)。
}
CFRD522 :{
- A:贪心分类讨论一下即可。
- B:bitset+背包暴力,或者每次组合数判断一下,只有全部一样的才能判断出来,(只有两种砝码的要特判,因为判断出一种另一种就知道了)
- C:树形DP,定义 f [ 0 / 1 / 2 ] [ i ] f[0/1/2][i] f[0/1/2][i]表示以 i i i为根的子树, i i i与父亲匹配, i i i与其中一个儿子匹配, i i i不参与匹配的方案数。只有剩下的匹配点总数为偶数,黑白染色后黑白点的个数一样多才满足最大唯一,dp时已经保证这一点。
- D:
鹦鹉咕咕咕(滑稽,维护log棵倍增的线段树,每次跳即可,复杂度 O ( n l o g 2 n ) O(nlog^2n) O(nlog2n) - E:构造题,不会QAQ
}
CFRD521 :{
- A:求个奇偶个数即可。
- B:每次贪心,遇到一个101的就将这三个中最后那个1变成0即可。
- C:排序,维护个前缀和即可。
- D:二分次数,每次扫一遍判断即可。
- E:离散化将同种缩在一起,枚举开始选多少个,二分跳多少场即可,期望 O ( n l o g n ) O(nlogn) O(nlogn)
- F:dp加个分层单调队列优化前缀最大即可。
}
CFRD523 :{
- A:直接除,向上取整即可。
- B:正负奇偶分类讨论一下,等差数列前缀和即可。
- C:覆盖,判断坐标和的奇偶便可以知道黑白,先分别算两个矩形,然后减去矩形交的即可。
- D:贪心构造,首先判断能否分 k k k次,然后二进制枚举去分,看是否在操作次数区间内即可。
- E:hash一下一个行区间的字母种类出现次数,枚举子矩阵判断即可,复杂度 O ( n 2 m ) O(n^2m) O(n2m)。
- F:将线段双关键字从大到小排序,然后维护主席树,下标为权值,对于每种权值维护前缀右端点最小,然后每次询问先lower_bound找到左端点符合的位置,查询前缀右端点最小的最大,看是否在询问区间内即可。
}