分治杂题

BZOJ2287 【POJ Challenge】消失之物

退背包!AC~然而这里是分治专场。
维护区间\([l,r]\),其他物品都选上了,只有\([l,r]\)的没选,每次递归左右区间,递归之前把大区间内另一半的物品塞进背包。到叶子后直接输出即可。共划分为\(\log\)层,每层做一遍\(O(nm)\)的背包,因此复杂度为\(O(mn\log n)\),足够通过。

arc070dL No Need

\(dp_x\)表示能否拼出和为\(x\),依次判断每张卡片\(i\),如果不选这张卡片,存在\(j\in[k-a_i,a_i)\)使得\(dp_j=1\),则该卡片不是不必要的。然后就是和上一题类似的分治,做一个 bitset 优化的 01 背包。

BZOJ4488 [JSOI2015] 最大公约数

从分治的角度考虑,当前要处理\([l,r]\),不妨认为\([l,mid-1]\)\([mid+1,r]\)都已经处理好了,现在只需要考虑跨过\(mid\)(即必选\(mid\))的最大值。然后好像没什么思路了,但是这个\(\gcd\)给的必有说法,挖掘一下性质,从\(mid\)开始往任意一边拓展,\(\gcd\)一旦变化至少除以二,最多变化\(\log\)次,而且显然只有\(\gcd\)即将发生变化的位置才可能成为答案。所以我们把左右两边\(\gcd\)即将发生变化的位置分别存下来然后枚举匹配即可,复杂度\(O(n\log^3n)\),感觉跑不满,可以通过。

BZOJ3745 [COCI 2014/2015 #2] Norma

仍然直接从分治的角度想,只需要考虑跨过\(mid\)的方案,也就是左端点在\([l,mid]\)枚举一遍,每次右端点取遍\([mid+1,r]\)。直接枚举是无法接受的,根据套路要想办法按段计算贡献。枚举左端点\(i\),记\(Mx=\max_{j=i}^{mid}a_i\)\(Mn=\min_{j=i}^{mid}a_i\)容易发现两个位置是非常特殊的,一个是\(\max_{k=i}^{j}a_k\ne Mx\)的最小的\(j\)的前驱,记作\(p_1\),一个是\(\min_{k=i}^{j}a_k\ne Mn\)的最小的\(j\)的前驱,记作\(p_2\)。下面分情况来考虑。记\(j\)为右端点。
\(p_1<p_2\)
对于\(j\in[mid+1,p_1]\),总贡献为\(Mx\times Mn\sum(j-i+1)\)
对于\(j\in[p_1+1,p_2]\),总贡献为\(Mn(\sum\max_{k=i}^ja_k(j-i+1))\)
对于\(j\in[p_2+1,r]\),总贡献为\(\sum\min_{k=i}^ja_k\max_{k=i}^ja_k(j-i+1)\)
否则:
对于\(j\in[mid+1,p_2]\),总贡献为\(Mx\times Mn\sum(j-i+1)\)
对于\(j\in[p_2+1,p_1]\),总贡献为\(Mx(\sum\min_{k=i}^ja_k(j-i+1))\)
对于\(j\in[p_1+1,r]\),总贡献为\(\sum\min_{k=i}^ja_k\max_{k=i}^ja_k(j-i+1)\)
容易发现,若\(i\)\(mid\)倒着枚举到\(l\)\(Mx\)\(Mn\)都是非严格单调的,\(p_1\)\(p_2\)也是不断向右移动的,拿指针维护一下,上面讨论的式子拆一拆,可以发现维护六种前缀和就可以了。比较考验代码实现

LOJ3781 「SDOI2011」拦截导弹

加上时间就是三维。第一问,设\(f_{1_i}\)表示以\(i\)结尾的答案,CDQ分治优化之即可。对于第二问,接着设\(g_{1_i}\)表示以\(i\)结尾的答案的方案数,\(f_{2_i}\)表示以\(i\)开头的答案,\(g_{2_i}\)表示以\(i\)开头的答案的方案数,对于\(f_{2_i}\),倒着再做一遍CDQ,方案数同样在树状数组上顺便维护。主要还是代码实现比较麻烦。

LOJ 2090 「ZJOI2016」旅行者

这题牛逼啊。一开始的想法是从左下角求一遍到每个点的最短路,然后两个点最短路的分叉点可能满足某种顺序,这样就可以愉快分治了。但是,没有这么好的事,这玩意是完全乱序的。然后我就不会了。某老哥说是套路,这种矩形问题直接大力分治,假如说当前考虑横坐标都在\([l_1,r_1]\)内,纵坐标都在\([l_2,r_2]\)内的询问,这显然构成了一个矩形,将矩形较长边从中间劈开,也就是若\(r_1-l_1+1>r_2-l_2+1\),则令\(mid=(l_1+r_1)/2\),否则\(mid=(l_2+r_2)/2\),从\(mid\)上每个点出发跑Dij,每次用\(dis_{x_1,y_1}+dis_{x_2,y_2}\)更新区间内的每个询问。然后两端点全部\(mid\)一边的递归处理。这样正确性是比较显然的,因为两端点跨\(mid\)的必然更新到答案了,两端点不跨\(mid\)的即使路线跨过了\(mid\)也会在这一层被考虑到。
复杂度呢?这不是暴力硬艹吗?然而结果是这样的。所以来分析复杂度。单层是\(\min(n,m)nm\log nm+\min(n,m)Q\)的,涉及到取\(\min\)的问题,YY一下,矩形为正方形且所有询问传到底的时候肯定是最坏情况,所以从这里来分析。设\(T(n,Q)\)表示边长为\(n\)的正方形内\(Q\)询问数的复杂度,类似的\(T(n,m,Q)\)表示边长为\(n\times m\)的矩形内\(Q\)询问数的复杂度。为了方便,下面分析时我们每一层往下传时都把所有询问平均分配。

\[T(n,Q)=n^3\log n^2+nQ+2T(\cfrac{n}{2},n,\cfrac{Q}{2})\\ T(n,Q)=n^3\log n^2+nQ+2(\cfrac{n^3}{4}\log (\cfrac{n}{2})^2+\cfrac{nQ}{4}+2T(\cfrac{n}{2},\cfrac{Q}{4}))\\ T(n,Q)=\cfrac{3}{2}n^3\log n^2-n^3+\cfrac{3nQ}{2}+4T(\cfrac{n}{2},\cfrac{Q}{4}) \]

到这里我们再YY找规律一下,一共\(\log n^2\)层,表示下来就是

\[T(n,Q)=\sum_{i=0}^{\log n^2}4^i(\cfrac{3}{2}(\cfrac{n}{2^i})^3\log(\cfrac{n}{2^i})^2-\cfrac{n^3}{2^{i}}+\cfrac{3nQ}{2^{i}})\\ T(n,Q)=\sum_{i=0}^{\log n^2}\cfrac{3}{2^{i+1}}n^3\log n^2-i\cfrac{3n^3}{2^i}-2^i{n^3}+2^i{3nQ}\\ \]

按照正方形把这个式子拆开算一下,发现是\(O(能过)\)的。然而以上式子有一半都是自己YY的,所以可能是错的。

posted @ 2025-10-09 21:18  Lordreamland  阅读(17)  评论(1)    收藏  举报