CodeForces练习计划

  • UPD1.0:2018.11.28
  • UPD2.0:2018.11.29
  • UPD3.0:2018.12.01

原则:有div1就做div1,否则div2,div3通常基本不做。


后期逐步更新,有空的话就写写每套我做了的题目大意和题解,会同步放到这里。尽量做到不咕咕咕


还需深入理解和有其它更优秀的做法还未写的题:

CFRD513:{

  • A:枚举用多少个8组成号码,剩下的数字看看除以10可不可以组成即可。
  • B:贪心,第一个选最大的999999…,另外一个选nn-这个数即可。
  • C:枚举HH为矩阵有多高,选一个最小的i=1nHsumai{ii+H1}\sum_{i=1}^{n-H}sum_{a_i}\{i\sim i+H-1\},然后再扫一遍宽度即可,复杂度O(nm)O(nm)
  • D:摆放位置没有影响,所以将L[i],R[i]L[i],R[i]分别排序后,对于每一个选max{L[i],R[i]}max\{L[i],R[i]\},最后答案为n+i=1nmax(L[i],R[i])n+\sum_{i=1}^n{max(L[i],R[i])},复杂度O(nlogn)O(nlogn)
  • E:可以发现每两个点的最短距离变为原来的二分之一向下取整,但是原长为11的还是11,所以先算总的除以二,再加上原长为1的即可,复杂度O(n)O(n)
  • FGH:不会,QAQ

}

CFRD514 :{

  • A:模拟题意即可。
  • B:O(nm)O(nm)扫一遍覆盖即可。
  • C:因为是全排列,贪心,每次删除剩余序列的奇数位置的数即可,因为每次可以删掉一半,复杂度O(n)O(nlogn)O(n)\sim O(nlogn)
  • D:先判断有无解,二分半径r,然后每次O(n)O(n)求距离x轴距离为r的那条线与所有点为圆心的半径r的在线段上的交集,有交集则可行,否则不可行,复杂度O(nlogn)O(nlogn)
  • E:按照bfs序,从叶子节点贪心往上合并即可。

}

CFRD516:{

  • D:分段求取做法,n小于2e6枚举答案,2e6的复杂度,n>2e6n>2e6枚举转了多少轮k/nk/n的复杂度。
  • E:置换贪心构造的方法,一开始对应就直接输出nn,否则一定可以构造到n1n-1,随便舍弃一个,以那一个位置为置换的空位置换即可。
  • F:hash+暴力可以O(nn×hash)O(n\sqrt{n}\times hash)卡过去,因为答案不超过1000,正解为后缀数组或者sam求lcp,线段树维护,dp转移,复杂度O(nlogn)O(nlogn),目前没写后面的这种做法【推荐大佬blog】。

}

CFRD517 :{

  • A:枚举能看的最大的页数,从后往前贪心枚举分配给第一天和第二天即可。
  • B:贪心+DP,维护尽量需要放‘a’少的路径
  • C:大区间每次贪心翻转3个,小区间二进制暴力枚举
  • D:预处理质数因子的幂的排列,并hash,flyod贪心跑最小操作次数,每次枚举将其变成因子的幂的情况。假如v=piaiv=\prod p_i^{a_i},那么vv的因子个数为(ai+1)\prod (a_i+1),所以只有因子的幂次数才影响因子个数。

}

CFRD518:{

  • A:设置dp[0/1/2][i][j]dp[0/1/2][i][j]表示当前在第ii个数字,值为jj,与前面一个相等,小于,大于的答案,转移用前缀和优化,复杂度为200×n200\times n,发现等于的一维可以和大于或者小于的一维合并,再加滚动数组,可以优化到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,因为这样每层减少4个,而开始有几层是减少不到4个人,所以期望为n29\frac{n^2}{9}个的。

  • D:首先找到aipia_ip_i最大,然后bipib_ip_i最大一直用的贪心会WA在105组数据,所以正解是凸包斜率优化dp+(矩阵优化或者等比数列求和)【推荐大佬blog】。

  • E:神仙题,不会,要用行列式和矩阵之类的东西,但是最后可以转化为求这颗树上的期望最大匹配数,用dp[0/1][i]dp[0/1][i]表示以ii为根的子树,ii匹不匹配的期望最大匹配数,然后O(n)O(n)的树形DP即可。

}

CFRD520 :{

  • A:贪心找一个最长的连续的即可。
  • B:最后肯定是将每一个质因子的次数变为1为最优答案,操作次数就是找出最大的一个质因子幂的次数,log2log_2这个次数向上取整就是答案(因为每次开根,幂是除以2的)。
  • C:贪心先吃1,然后再吃0,维护一个2的幂次的前缀和,推推式子,每次就可以O(1)O(1)的回答了。
  • D:求一个最大欧拉回路,其实就是每个数和它的倍数都有正负,所以可以4×val4\times val的值,暴力枚举一下倍数,复杂度为调和级数。
  • E:每次都只删除当前区间在dfs序里面最左边或者最右边的一个点是最优的,所以线段树维护dfs序在原区间的最大最小值,再维护个区间lca就可以了
  • F:拓扑排序两次,一次正向,一次反向,所以建两个图,找到一个点可以到它的和它可以到的点数,点数大于等于n2n-2的才是重要或者次重要点(细节很多要注意)。

}

CFRD522 :{

  • A:贪心分类讨论一下即可。
  • B:bitset+背包暴力,或者每次组合数判断一下,只有全部一样的才能判断出来,(只有两种砝码的要特判,因为判断出一种另一种就知道了)
  • C:树形DP,定义f[0/1/2][i]f[0/1/2][i]表示以ii为根的子树,ii与父亲匹配,ii与其中一个儿子匹配,ii不参与匹配的方案数。只有剩下的匹配点总数为偶数,黑白染色后黑白点的个数一样多才满足最大唯一,dp时已经保证这一点。
  • D:鹦鹉咕咕咕(滑稽,维护log棵倍增的线段树,每次跳即可,复杂度O(nlog2n)O(nlog^2n)
  • E:构造题,不会QAQ

}

CFRD521 :{

  • A:求个奇偶个数即可。
  • B:每次贪心,遇到一个101的就将这三个中最后那个1变成0即可。
  • C:排序,维护个前缀和即可。
  • D:二分次数,每次扫一遍判断即可。
  • E:离散化将同种缩在一起,枚举开始选多少个,二分跳多少场即可,期望O(nlogn)O(nlogn)
  • F:dp加个分层单调队列优化前缀最大即可。

}

CFRD523 :{

  • A:直接除,向上取整即可。
  • B:正负奇偶分类讨论一下,等差数列前缀和即可。
  • C:覆盖,判断坐标和的奇偶便可以知道黑白,先分别算两个矩形,然后减去矩形交的即可。
  • D:贪心构造,首先判断能否分kk次,然后二进制枚举去分,看是否在操作次数区间内即可。
  • E:hash一下一个行区间的字母种类出现次数,枚举子矩阵判断即可,复杂度O(n2m)O(n^2m)
  • F:将线段双关键字从大到小排序,然后维护主席树,下标为权值,对于每种权值维护前缀右端点最小,然后每次询问先lower_bound找到左端点符合的位置,查询前缀右端点最小的最大,看是否在询问区间内即可。

}

posted @ 2018-11-28 19:47  VictoryCzt  阅读(529)  评论(0编辑  收藏  举报