「模拟赛」Solution Set
\(\text{heart}\)
\(\text{Solution}\)
可以记 \(f(u)\) 为从 \(u\) 出发到某个点停止的方案数,\(f(u)\) 可以 \(\mathcal O(n)\) 转移,显然复杂度为 \(\mathcal O(n^2)\).
当前我们要转移 \(u\) 子树内,对于 \(v\in \text{subtree(u)}\) 我们记 \(g_v\) 为 \(\min\limits_{p_k>p_j}p_k\),其中 \(k\) 在 \(u\) 到 \(v\) 路径(不包含 \(u,v\))上的节点,仅当 \(p_u<g_v\) 且 \(p_u>p_v\) 时 \(v\) 可以对 \(u\) 贡献,我们可以用线段树维护 \(f(u)\),考虑线段树下标为 \(i\) 的位置维护 \(p_j=i\) 的 \(v_i=g_j\) 和 \(s_i=f(j)\),我们可以先用对子树进行线段树合并然后考虑修改和查询
-
对于 \(k\in[1,p_i]\) 修改 \(v_k\leftarrow \min(v_k,p_i)\).
-
查询 \(\sum_{k=1}^{p_i}[v_k>p_i]s_k\).
可以用 \(\text{Segment Tree Beats}\) 维护,复杂度 \(\mathcal O(n\log n)\).
\(\text{「USACO23OPEN」Triples of Cows P}\)
\(\text{Link}\)
\(\text{Solution}\)
发现删点后连边操作是 \(\mathcal O(n^2)\) 级别的,考虑建虚点来优化。
具体的,考虑我们将原树上点称为黑点,新建的虚点为白点,我们将边拆为一个点,我们将原树上的边 \((u_i,v_i)\) 变为 \((u_i,n+i),(v_i,n+i)\),由于 \(n\) 最后删去,我们可以以 \(n\) 为根。我们删点可以直接将所有儿子合并到父亲上,用并查集维护时间复杂度就是 \(\mathcal O(n\log n)\) 的而且保证了图仍然是一棵树,原树 \(u,v\) 直接相连等价于黑点 \(u\) 和黑点 \(v\) 同时是某个白点的邻接点,我们用 \(\mathcal W\) 表示 白点集合,用 \(\mathcal B\) 表示 黑点集合。
考虑如何算贡献,考虑计算五元组 \((a,x,b,y,c)\),其中 \(a,b,c\in \mathcal B,x,y\in \mathcal W\),我们可以记录 \(f_u,g_u,h_u\) 为 \(u\) 的 \(1/2/3\) 级儿子数量。
- \(x=y\),我们可以在 \(x\) 的邻接点中任选 \(3\) 个互不相同的点即可,贡献为
- \(x\not= y\),我们可以枚举 \(b\) 然后分为两种情况讨论
\(\text{Case1:}\) \(x\) 为 \(b\) 父亲,\(y\) 为 \(b\) 儿子,贡献为
\(\text{Case2:}\) \(x,y\) 为 \(b\) 互不相同的儿子,贡献为
发现每次删点时只会改变 \(u\) 的 \(1/2/3\) 级祖先,每次 \(\mathcal O(1)\) 修改,复杂度为并查集的 \(\mathcal O(n\log n)\).
\(\text{A Dance of Fire and Ice}\)
\(\text{Solution}\)
\(\text{opt}=0\) 的操作只有最后一个有用,所以只需要考虑 \(\text{opt}=1\) 的操作是否选择,由于取模为质数可以将模 \(p\) 的乘法运算转化为离散对数的模 \(p-1\) 的加法运算,问题等价于求下面多项式的非零项个数(其中乘法运算是模 \(p-1\) 的循环卷积)
考虑背包 \(\text{DP}\) 有 \(\mathcal O(np)\) 的复杂度,背包每次会转移过多无效状态,考虑优化。
有效状态为 \(a_x=1\) 且 \(a_{(x+v_i)\bmod (p-1)}=0\),因为满足 \(a_x=1\) 且 \(a_{(x+v_i)\bmod (p-1)}=0\) 和满足 \(a_x=0\) 且 \(a_{(x+v_i)\bmod (p-1)}=1\) 的 \(x\) 的数量相同,我们可以每次考虑 \(a_x\not=a_{(x+v_i)\bmod (p-1)}\) 的所有 \(x\),不难发现这样的转移次数是 \(\mathcal O(p)\) 的。考虑每次二分比较 \([l,r]\) 与 \([l+v_i,r+v_i]\) 是否相同,可以得到每次转移的 \(x\),比较区间相同可以用树状数组维护 \(\text{Hash}\) 比较,总复杂度为 \(\mathcal O(p\log^2 p+n)\).
\(\text{「CF1086F」Forest Fires}\)
\(\text{Link}\)
\(\text{Solution1}\)
带权不好求考虑转化为 \((t+1)F(t)-\sum_{i=0}^tF(i)\) 其中 \(F(x)\) 表示在 \(x\) 时刻着火格子数目。
\(F(x)\) 相当于所有点在 \(x\) 时刻构成的着火矩形的并。
如果所有点的相交情况不变的话则有 \(F(x)\) 的二阶差分为常数,设矩形 \(i,j\) 相交时间为 \(p(i,j)\),所有的 \(p(i,j)\) 将 \(F(x)\) 分为 \(\mathcal O(n^2)\) 段,每段为一个二次多项式,每段前缀和为三次多项式,直接 \(\text{Lagrange}\) 插值即可。
时间复杂度瓶颈在于求矩形并,可以扫描线 \(\mathcal O(n\log n)\),总时间复杂度为 \(\mathcal O(n^3\log n)\),足以通过原题。
\(\text{Solution2}\)
搬题人把原题加强到了 \(n\le 2000\),考虑更优的做法。\(\text{Lagrange}\) 插值做法存在扫描线的瓶颈,考虑其他思路。
矩形交可以转化为矩形并的容斥设 \(F(\mathcal S,t)\) 为考虑点集 \(\mathcal S\) 中点时刻 \(t\) 的矩形交
我们令 \(g(\mathcal S)=F(\mathcal S,t)-\sum_{i=0}^tF(\mathcal S,i)\) 考虑如何快速算出。
对于 \(\mathcal S,\mathcal T\) 满足 \(\max\limits_{u\in\mathcal S,v\in\mathcal S}|x_u-x_v|=\max\limits_{u\in\mathcal T,v\in\mathcal T}|x_u-x_v|\) 且 \(\max\limits_{u\in\mathcal S,v\in\mathcal S}|y_u-y_v|=\max\limits_{u\in\mathcal T,v\in\mathcal T}|y_u-y_v|\) 有 \(g(\mathcal S)=g(\mathcal T)\),我们可以发现如果一个有 \(a\) 个点确定的矩形中存在不参与确定矩形边界的点集 \(\mathcal S\) 如下图所示,则贡献为 \(\sum_{k=0}^{|S|}\binom{|S|}{k}(-1)^{k+1}=[|S|=0]\)。

所以可以发现当左右边界确定后,唯一可以满足要求的点是 \(E,F\) 在 \(y\) 坐标的前驱后继

所以可以将点按 \(x\) 排序,枚举确定左边界点和右边界点的点,用 \(\text{multiset}\) 维护点的前驱后继维护贡献。
如何计算一个矩形的 \(g(\mathcal S)\),其等价于考虑以矩形 \(4\) 个点为点集的 \(g(\mathcal S)\),为一个三次分段函数,\(\text{Lagrange}\) 插值即可。
总时间复杂度为 \(\mathcal O(n^2\log n)\).
\(\text{Walk}\)
考虑如何处理平方,可以转换
我们可以考虑有序路径对 \((p,q)\) 的贡献为 \(w(p)w(q)2^{n-|p\cup q|}\).
考虑 \(\text{DP}\),设 \(f(u,v)\) 为路径 \(p\) 终点为 \(u\),路径 \(q\) 终点为 \(v\) 的贡献,我们可以扩展 \(u\) 到 \(u'\)(\(v\) 同理),考虑转移式
如果我们要将 \(u'\) 是否属于路径 \(q\) 记录在状态上我们至少用 \(O(2^n)\) 的状态描述,但是 \(\text{DAG}\) 我们可以钦定合理转移顺序。具体我们每次钦定转移拓扑序较小的点转移即可。复杂度为 \(\mathcal O(n^2+m)\).

浙公网安备 33010602011771号