正睿寒假杂题选讲 2024

QOJ8005. Crossing the Border

很显然的暴力,我们将 \(b_i\) 升序排序,然后按照集合右端点从小到大加入保证方案不重,这样子复杂度是 \(O(3^n)\)

考虑利用 \(\sum a_i \le m\) 的这个约束,可以想到类似 meet-in-middle 的思想,我们将集合分为两部分,每部分 \(\frac{n}{2}\) 个二元组,然后进行匹配。

我们可以枚举一个中间状态 \(LR\),表示从左边选出 \(L\),从右边选出 \(R\),在这个基础上匹配。我们可以从 \(L\) 的子集内选取集合转移到 \(R\) 的超集之中。假设 \(L'\subset L\)\(R \subset R'\),那么我们需要做的就是 \(L'R \to LR'\)。同样由于每次我们要加入包含最大右端点的集合,所以 \(L'\) 应该不含 \(\operatorname{maxbit}(L)\),这样新加入的部分 \(L-L'\) 满足最高位最新加入。\(R\) 同理。然后利用 \(\sum a_i \le m\),我们可以事先对于 \(L'\)\(R'\) 按照 \(\sum a_i\) 排序,然后只需要枚举 \(L'\),同时对于 \(R'\) 双指针即可。

这样子我们相当于枚举了 \(L\) 及其子集,这是 \(O(3^{\frac{n}{2}})\) 的。同时枚举了 \(R\),这是 \(O(2^{\frac{n}{2}})\) 的。所以总的复杂度为 \(O(6^{\frac{n}{2}})\)

QOJ8074. Multiply Then Plus

\(y=a_i\times x+b_i\),那么 \(b_i=(-x)\times a_i+y\)

如果没有修改,对于不同 \(x\) 全局查询。那么就是维护一个在 \(b_i-a_i\) 的坐标系中维护一个上凸壳。每次对于斜率 \(-x\) 进行二分即可。如果改为先对 \(-x\) 排序,再离线查询可以去掉二分改用指针维护做到线性。

如果是区间的话,可以用线段树维护凸包,每次将询问分裂为 \(\log\) 个询问取最大值。同理如果每次二分的话,是 \(O(n\log^2n)\) 的。但是我们还是可以对于 \(-x\) 排序,然后对于线段树每个节点维护一个指针,表示上次扫描到哪里了,每次移动指针就行了。可以做到 \(O(n\log n)\)

本题有了修改操作可以进行线段树分治。可以发现本题是对于单一时间点询问,但是修改操作有生效时间。于是我们将每个询问都打到对应时间点的叶子节点到根的每个点上,然后将修改操作拆分成 \(\log\) 个放到对应节点上,每到一个节点就建立一颗线段树然后处理对应询问即可。时间复杂度 \(O(n\log^2 n)\)

QOJ7514. Clique Challenge

先考虑一个稠密图 \((n\le 40)\) 的做法。考虑 meet-in-middle,将图分成两部分,左右两边分别内部处理哪些子集为一个团。然后对于左边每一个子集求出到右边边集的交得到连到右边的一个点集,然后做一个高维前缀和就可以了。

对于 \(n\) 更大的时候(图为一个稀疏图),我们可以将问题分成若干个 \(n\le 40\) 的子问题。考虑三元环计数的做法,把边定向,由度数小的连向度数大的,这样每个点的出度为 \(\le \sqrt {2m}\)。连出来的是一个 DAG,对于拓扑序最小的点,一定是向团中所有点都连了边。我们直接在拓扑序最小的点处统计整个团的贡献。而 \(\sqrt {2m}\)\(44\),所以可以使用上述做法进行计算(注意这里要求必须包含那个最小点)。对于 \(n\) 个点都做一遍即可。时间复杂度 \(O(m^{\frac{3}{4}}2^{\sqrt {\frac{m}{2}}})\)

这个做法的好处是对于每个团唯一对应了一个点,所以不用考虑被重复计算之类的问题。

QOJ7899. Say Hello to the FutureA

一个区间合法的要求是区间最大值小于等于区间长度。直接 dp 复杂度应该是 \(O(n^2)\) 的。

QOJ7610. Bus Lines

如果是单点求解的话,就是贪心往上跳。
一般这种对于所有信息的求和都是要分治。这题是统计树上路径所以用点分治,有一个设 \((u,v)\)的 lca 是 \(r\)。有一个很重要的性质:\(f(u,v) \le f(u)+f(v) \le f(u,v)+1\)。所以我们先按后者来计算。然后发现如果可以取到下界的话,需要在 \(u-r\)\(r-v\) 路径中各存在 \(p_u\)\(p_v\) 是的二者可以直接联通。可以用树上启发式合并来计算。

QOJ7630. Yet Another Maximize Permutation Subarrays

QOJ8131. Filesystem

QOJ837

点分治。考虑原图的一颗生成树,进行点分治。但可能有一些非树边使得路径更短。分为两种,非树边在同一子树内,或者在不同子树内。第一种情况直接从分治中心出发,进行最短路,第二种情况我们发现如果 \((u,v)\) 可以通过分治中心到达或者不同子树内的边到达的话,说明分治中心和那条非树边成环。对于每个分治中心,这种环不超过过。注意每次分治在同一子树内的可能也需要更新。

P9732 [CEOI2023] Trade

全局最优区间选择问题,肯定猜测最优区间满足决策单调性,事实上这种区间前 \(k\) 大之和状物(本题还多了一个减去区间 \(c\) 之和)也确实具有决策单调性。于是可以直接用主席树维护区间前 \(k\) 大之和,然后分治计算答案。

第二问就很神秘了。需要找到最优区间,然后标记区间内那些 \(\ge k\) 的数。可是最坏情况下可能的区间会有 \(O(n^2)\) 个,我们难以一一处理。这个时候很多区间都是无用的,我们需要找到一些有用区间。

考虑两个最优区间 \([x_1,y_1]\)\([x_2,y_2]\),满足 \(x_1<x_2\le y_2<y_1\),这个时候其实 \([x_1,y_1]\) 是无用的。

由于本题具有决策单调性,所以根据四边形不等式,有 \(w(x_1,y_2)+w(x_2,y_1)\ge w(x_1,y_1)+w(x_2,y_2)=2\times \max w(l,r)\),又因为 \(w(x_1,y_2)\le \max w(l,r)\)\(w(x_2,y_1)\le \max w(l,r)\),所以可以得到 \(w(x_1,y_2)=w(x_2,y_1)=\max w(l,r)\),故区间 \([x_1,y_2]\) 和区间 \([x_2,y_1]\) 也是最优区间。对于一个小区间,竞争少,所以一个数成为前 \(k\) 大的可能性也就更大,所以区间 \([x_1,y_1]\) 是不如拆分出的区间 \([x_1,y_2]\)\([x_2,y_1]\)\([x_2,y_2]\)

这是一个双指针状物,所以对于每个 \(i\),我们只需要求出其最大的决策点 \(p_i\) 即可。同时注意我们上面是 \(y_2<y_1\),所以除了 \([p_i,i]\) 之外,还有一些 \(r=i\) 的区间,把所有 \(l\in[p_j,p_i]\) 之间的合法区间都加进去即可(其中 \(j\)\(i\) 前面第一个最优的右端点)。这样子我们一共形成了 \(O(n)\) 个有效区间,我们只需要标记这些区间中的区间前 \(k\) 大值即可。

于是就转化为有若干区间操作 \((l,r,v)\),要求覆盖区间内 \(\ge v\) 的数字,可以对于 \(v\) 进行扫描线之后用并查集直接合并即可。

时间复杂度 \(O(n\log ^2n)\)

CF1889D Game of Stacks

posted @ 2024-02-17 09:12  Mirasycle  阅读(455)  评论(0)    收藏  举报