C - Candles
枚举最后点燃的区间是什么(长度一定为 \(k\) ),这个区间的答案根据左端点右端点是否在原点两侧判一下就好。
D - Median of Medians
先二分答案,然后 check 答案是否小于等于 \(x\),设 \(s_i\) 表示 \([a_i\leqslant x]\) 的前缀和,则一个区间 \((l,r]\) 的中位数小于等于 \(x\) 当且仅当 \(s_r-s_l\geqslant\lfloor\dfrac{r-l}{2}\rfloor +1\),即 \(2s_r-r\geqslant 2s_l-l+1\),用树状数组求出中位数小于等于 \(x\) 的区间个数和 \(\lfloor\dfrac{n(n-1)}{4}\rfloor+1\) 比较即可。
E - Ribbons on Tree
先考虑容斥,钦定某个集合的边强制不选,设 \(g(S)\) 表示强制不选 \(S\) 中的边集后任意配对的方案数,则答案根据子集容斥为 \(\sum(-1)^{|S|}g(S)\)。
先考虑知道 \(S\) 怎么求 \(g(S)\),假设把 \(S\) 中的边删掉后形成了大小为 \(n_1,n_2,\dots,n_c\) 的连通块,显然连通块之间是独立的,考虑一个连通块的答案,其只与大小有关,具体地设 \(h(n)\) 为大小为 \(n\) 的连通块的答案,则有: \[ \begin{equation} h(n)= \begin{cases} 0\quad &2\not \mid n\\ (n-1)(n-3)\dots1 \quad &2\mid n \end{cases} \end{equation} \] 显然当 \(n\) 是奇数无法匹配完为 \(0\),\(n\) 为偶数时每一次找到编号最大的点然后选择和它匹配的点,每一次分别有 \((n-1),(n-3),\dots,1\) 种方案。
然后考虑快速算 \(\sum (-1)^{|S|}g(S)\),设 \(f(u,i)\) 表示以 \(u\) 为根的子树,现在还有 \(i\) 个点没有匹配过的方案数。转移时先做一个树形背包,然后我们考虑 \(u\) 向 \(fa\) 连的这条边是否要被覆盖,如果不是,那就要让这个子树内的点自行匹配,然后因为 \(|S|\) 变大了 \(1\) 还要取反,即 \(f(u,0)=-\sum_\limits{2\mid i}f(u,i)h(i)\)。 最后根节点由于没有连向 \(fa\) 的边所以 \(f(root,0)\) 不取反,答案为 \(f(root,0)\)。复杂度 \(O(n^2)\)。
可能有疑问为什么做背包的时候不需要考虑互相连,因为这一部分的答案会在上面某个时候确定断掉某条边时被记上。
F - Robots and Exits
套路题(但是还是没想出来 /kk)。显然每个机器人只可能从其左右最近的出口(如果有)出去,先把只有一边有出口的删掉不影响答案,然后我们把剩下的机器人看作坐标系中的一个点 \((x,y)\),分别表示其到离其最近的左/右出口距离。可以知道一个机器人最后从哪个出口出去只和向左移动的历史最大值和向右移动的历史最大值哪个先到达了这个机器人这一维的坐标有关。同时如果我们把历史最大值也看做点,那么我们发现如果某个机器人代表的点在历史最大值的移动轨迹上方,则其一定从左出口出去,反之同理(在线上时看哪一维先到达)。
那么我们转化一下题意,你需要求出用一条每次只能向上或向右走一格的线从原点开始把点集分成两个本质不同的集合的方案数。这个我们可以让线贴着点走,每次钦定下一个在线下方的点,设 \(f(i)\) 表示最后一个下方的点是 \(i\) 的方案数,则有转移方程 \[ f(i)=1+\sum\limits_{x_j<x_i,y_j<y_i}f(j) \] 加 \(1\) 是从空集转移过来,这个只需要排个序用树状数组维护即可,复杂度 \(O(n\log n)\)。