A.故障机器人
天生具备大常熟,劳资就爱写递归用vector写唐怎么你了,复杂度对了凭什么不让过,时间卡这么紧有意思吗?
贡献可以拆为识别为 ↑ 的字符与识别为 → 的字符间的贡献,而字符间的贡献又互相独立,所以可以先预处理 \(val[x][y]\) 代表字符 \(x\) 识别为 ↑,字符 \(y\) 识别为 → 的这两个字符间的贡献。然后用这个预处理出 \(f[x][mask]\) 代表 \(x\) 识别为 ↑,所有字符识别状态为 \(mask\) 时 \(x\) 的贡献,最后枚举所有状态求答案即可,时间复杂度 \(O(n+2^m)m\)。
B.反二维偏序
真的想不到啊,每次都被这种题区分。
将二元组 \((b_i,a_i)\) 转化为线段 \([b_i+1,a_i]\),转化完后两个二元组为反二维偏序关系其实就是两条线段有交点。
如果有交的线段进行连边,那么区间合法等价于一个连通块必须是一个完全图。
考虑对于每个左端点 \(l\),求出它能向右扩展的最右端点 \(r\),满足 \([l,r]\) 为合法区间。
由于这个东西有单调性,所以可以双指针。加入一条线段 \([l_i,r_i]\) 时,找到这条线段所处连通块中最左边线段的左端点 \(L\) 和最右端点 \(R\),由于是完全图,也就是说这条线段应与 \([L,R]\) 间的线段全都有交,于是判断一下 \([l,r]\) 中被覆盖次数最多的位置的最多次数与 \([L,R]\) 之间的线段数是否相同,若不同则非法。
以上操作均可以用线段树简单维护。
C.根本不是人
赛时想到了复杂度为 \(n^3m\) 的优秀暴力,但是
一分都多拿不了果断放弃,结果广二老哥 \(O(\frac{n^3m}{w})\) 直接过了。
正解不会,说一下暴力。
枚举根,设 \(f[i][j]\) 代表树 \(a\) 的 \(i\) 子树能否匹配树 \(b\) 的 \(j\) 子树,用匈牙利跑一下二分图最大匹配看是不是完美匹配即可,然后用 \(\text{bitset}\) 优化一下匈牙利,总时间复杂度 \(O(\frac{n^3m}{w})\)。
D.DS?代数!
从左往右枚举右端点 \(r\),对于每个左端点 \(l\) 维护 \(\mathrm{mex}(a_{l\dots r})\) 记为 \(\mathrm{mex}(l,r)\),显然这个是随着 \(l\) 递减而单调不减的。我们当前加入的 \(a_r\) 只会影响到一段区间 \([l',r']\),满足 \(\forall l\in[l',r'],\mathrm{mex}(l,r)=a_r\),而每次满足 \(\mathrm{mex}\) 相同的一个连续段都会对对应的 \(\mathrm{mex}\) 的答案造成贡献,题解说可以对每个值域维护一条扫描线,可持久化线段树维护扫描线即可。
但是不太懂咋实现啊,现在只会开值域棵历史和线段树给他可持久化,抽象。
abc378_f
一个链能造成贡献当且仅当链的两头的点度数为 \(2\),其余点的度数都为 \(3\),只有这两种点是有用的。于是可以用并查集把所有度数为 \(3\) 的点放入一个连通块,对于每个连通块求出与之相邻的度数为 \(2\) 的点的数量,记为 \(cnt_i\),最终我们的答案为 \(\sum\limits_{cnt_i\ge2}\binom{cnt_i}{2}\)。
abc378_e
记 \(s\) 为前缀和数组,那么我们要求的为:
\[ \sum_{1 \leq l \leq r \leq N} \left( \left(s_r-s_{l-1}\right) \mathbin{\mathrm{mod}} M \right) \]首先将所有 \(s_i\) 对 \(m\) 进行取模,对于 \(s_i\) 它对答案的贡献为 \((2i-n)s_i\),那么最终我们的答案一部分为为 \(\sum (2i-n)s_i\)。
之所以说是一部分是因为 \((s_r-s_{l-1})\pmod m = s_r\pmod m-s_{l-1}\pmod m\) 当且仅当 \(s_r\pmod m\ge s_{l-1}\pmod m\),若 \(s_r\pmod m<s_{l-1}\pmod m\) 那么我们应加上 \(M\),设 \(f_i\) 代表 \(\sum\limits_{j=1}^
{i-1}[s_j>s_i]\) ,我们的答案最后要加上 \((\sum f_i)\times M\)。