2021.11.16 模拟赛题解

真·看心情写题解(

马上还有 4 天 NOIp 了,冲一把!还有一车 blog 要补,绝对不鸽!

T1

简单题,考虑一个 \(a_i\)​ 对答案的贡献是多少,显然对于一种区间长度 \(j\)​,它会在 \(\min(\min(j,n-j+1),\min(i,n-i+1))\)​ 个长度为 \(j\)​ 的区间中出现,因此它对答案的贡献就是 \(a_i·\sum\limits_{j=1}^n\min(\min(j,n-j+1),\min(i,n-i+1))·\frac{1}{j}\)​,枚举区间长度然后差分一下即可,复杂度线性。

赛时 \(a_i\) 用了读入优化结果后面 \(q\) 组询问的 \(x,y\) 用的 scanf,于是愉快地 TLE 了。。。。

总结:对于读入量超过 \(3\times 10^6\) 的题目,一定要使用读入优化!同时比赛结束一定要检查读入优化是否全部加上了,如果不检查,如果运气好则是 TLE,如果运气不好你使用的读优板子与 scanf 混用会出现奇怪的错误,那挂成 0 分都是有可能的!

T2

考虑在每个人可选的两个位置之间连一条边,那么显然可以得到一张 \(2n\) 个点 \(2n\) 条边的图,如果这张图中有连通块点数 \(>\) 边数直接输出 NO 即可,否则显然每个连通块都是基环树,一个连通块只有两种匹配的方式,对于每种匹配方式我们显然可以仿照 8.11 模拟赛 2 T1 积和式 的套路计算出每种匹配方式会使左边重量和 \(-\) 右边重量和增加多少,设其分别为 \(A_i,B_i\),于是问题等价于对每个连通块,在 \(A_i,B_i\) 中选择一个累加入和,求得到的和的绝对值的最小值。

如果我们先假设所有连通块都选择 \(A_i\),那么本题可以视作每个物品体积为 \(B_i-A_i\) 的 01 背包。但由于这题直接 01 背包复杂度高达 \(nW\),无法通过,因此需要优化。这里提供三种优化方式:

  1. bitset 优化,由于此题 01 背包的值域只有 \(\{0,1\}\),因此使用 bitset 的位运算加速可将常数变为六十四分之一,这样即可通过。
  2. 根号优化。注意到此题的特殊性质:\(\sum |B_i-A_i|\)​​​ 与 \(\sum w_i\)​​​ 是同一数量级的,根据经典结论,对于 \(\sum\limits_{i=1}^na_i=N\)​​​ 的 \(\{a_n\}\)​​​,\(a_1,a_2,\cdots,a_n\)​​​ 中最多有 \(\Theta(\sqrt{N})\)​​​ 种不同的数,因此转化为多重背包,前缀和优化一下即可,复杂度 \(\Theta(W\sqrt{W})\)​​。当然如果再加个二进制优化,再使用 bitset 可以做到 \(\frac{W\sqrt{W}}{\omega}\)​​ 的优秀复杂度。
  3. FFT 优化。考虑将存在性问题转化为计数问题。构造生成函数 \(F(x)=\prod\limits_{i=1}^n(1+x^{B_i-A_i})\),然后求其非零项即可。使用分治 + NTT 可以做到 \(W\log n\log W\)

实测使用第一种效果较好,最慢的一个点只用了 942ms。

总结:碰到特殊的 01 的背包问题,可以考虑采取以下三种方式优化:

  • bitset。
  • 根号优化。
  • FFT 将存在性问题转化为计数问题。

T3

直接求出每个子树编号最大值 \(R_i\) 和最小值 \(L_i\),连边 \(L_i\to R_i+1\) 后倍增即可。

总结:碰到传送来传送去的题,可以考虑如果到 \(x\) 后下一个被传送到的位置为 \(p_x\),那么连边 \(x\to p_x\)​ 后倍增。

T4

首先考虑将每个区间 \([l,r]\) 中加入两维 \(l’,r’\) 表示去掉左边的挡板后,人的活动范围为 \([l’,r]\),去掉右边的挡板后,人的活动范围为 \([l,r’]\),我们不妨用 \((l’,l,r,r’)\) 这个四元组表示这个区间。那么两个满足 \(l_2\le r_1\) 的区间 \((l_1’,l_1,r_1,r_1’),(l_2’,l_2,r_2,r_2’)\) 可以同时被选的充要条件是 \(l’_2\ge r_1\)\(r’_1\le l_2\)

因此我们先考虑求出这些四元组,具体找法就是对 \(y\) 轴扫描线,开一个 set 维护目前所有挡板的横坐标,碰到一个下边界就加入这个挡板的 \(x\) 坐标的单点,碰到一个上边界就删除这个单点,每加入一个单点就遍历它 set 的前三个前驱和前三个后继并将形成的 4 个四元组加入备选集合。

得知了备选集合之后就可以 DP 了。我们考虑将所有四元组 \((l’,l,r,r’)\)\(l\) 从小到大排序,那么按照 \(l\) 的顺序考虑一个四元组 \((l’,l,r,r’)\) 时,就维护一棵树状数组查询 \([1,l’]\)\(\max+1\) 得到以这个四元组结尾的符合条件的子集大小的最大值,然后当扫描到 \(r\) 时,将树状数组 \(r’\) 位置的值对这个区间的 DP 值取 \(\max\) 即可。

时间复杂度 \(\Theta(n\log n)\)

总结:1. 求最多选出多少个符合 xxx 条件的点时,通常可以转化为区间覆盖的问题,如果是二分图那有时也可二分图匹配做。2. 对于最多选出多少个 x 元组之类的问题,通常可以将这些 x 元组按某一维度排序然后 DP。

posted @ 2021-11-16 23:40  tzc_wk  阅读(24)  评论(0)    收藏  举报