codeforces小做

打算这一个月做50道codeforces,尽量不刷水吧。


813E   感谢wxy大神指导。对于位置i,权值为w[i],记录最大的a[i]使区间[a[i],i]中有k+1个w[i]。询问[l,r],等价于统计[l,r]中有多少个a[i]>=l的i,这些位置是不能被选取的。主席树实现。

813F   线段树按时间分治+并查集启发式合并。将每条边存在的时间区间插入到线段树中,转化成只有加边和撤销的问题。加边的判断可以通过并查集解决,计算每个点到根节点的路径长度为奇数或偶数即可。而撤消操作则要求使用并查集的启发式合并,如果使用路径压缩的话,复杂度并不保证。

814E   dp[i][j1][j2][k1][k2]表示前i个节点,最短距离为li的点中剩余度数为1的有k1个,剩余度数为2的有k2个,最短距离为li-1的点中剩余度数为1的有j1个,剩余度数为2的有j2个的方案数。转移就是枚举当前节点与前面哪一个节点相连。

注意:1、题目要求最短路唯一。2、可以特殊处理前两个节点。3、每次将dp[cur][0][0][j][k]加入到dp[cur][j][k][0][0]

833B   dp[i][j]表示前i个分成j段的最大值,先枚举段数,两层之间的转移可以通过线段树优化,O(nklogn)

833C   因为最终序列并不多,枚举每种序列,判断是否可行。记录当前匹配到第i位,是否卡上下界的情况,细节问题处理一下就好。

821E   暴力dp,矩乘转移

835D   若一个字符串是k+1阶,则其必是k阶,可用数学归纳法证明。dp[l][r]表示子串[l,r]是多少阶,用manacher判相等即可。

835E   19=10+9.第一轮,将二进制的第0位为1的数、第1位为1的数……挑出来,分别询问,总共10次。可以确定有奇数个还是偶数个y,二进制的第i位为1。因为两个y的位置不同,所以存在一个pos,使得恰好有1个y满足二进制的第pos个y。第二轮,分别选取二进制的第i位和第pos位都为1的数,共9轮,这些数中最多有一个y,于是可以确定这个y的二进制的每一位是否为1.综合一二轮的结果,可以得出另一个y的位置。

893D   每个零的位置,加尽量多的钱,保证钱数+从这个位置开始的最大连续子段和不超过d。

893E   分解质因数,对于每个质因子隔板法进行分配。

893F   主席树。按照深度排序后,询问变成深度在[dep[x],dep[x]+k]之间,dfs序在[in[x],out[x]]之间的最小值。但直接查询前缀树root[dep[x]+k],因为深度在[1,dep[x]-1]之间的点不存在dfs序在[in[x],out[x]]之间的。

你可能感兴趣的:(总结)