C
把每个qi看成点,则问题转化为:求一个最大的k,遍历k个点的完全图需要的最小步数+1不超过n,
(这里+1的原因是把起点加进去)
讨论k的奇偶:
k为奇数,每个点度数为偶数,这是一个欧拉回路,步数为边数;
k为偶数,每个点度数为奇数,保留2个奇度数点,将剩下的点度数改造成偶数,需要(k-2)/2步,然后得到一个欧拉图;
于是得到公式.
D
考虑d个数属于的集合mask,那么可以确定 总集合^mask 的集合是不符合要求的(它的子集也是不符合要求的),于是可以排除所有的"bad mask".
E
首先注意到数组范围n*m<=100000,于是可以确定n的上限(n<=400),为了满足区间相互不包含,要保证对于 li-1<li && ri-1<ri
所以,如果知道当前取的左端点集合和右端点集合,那么方案已经唯一确定了,根据这个性质可以用dp[i][j][k]统计:
dp[i][j][k]表示加入前i个数,j个左端点k个右端点的方案数;
转移有4种情况对应:i不加入,i为左端点,i为右端点,i为左端点和右端点.
显然必须满足j>=k,最后答案为dp[m][n][n];
为了满足"必定存在x为左端点的区间"当加入x时要强制转移.