「模拟赛」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\) 个互不相同的点即可,贡献为

\[\sum_{u\in\mathcal W}(f_u-1)f_u(f_u+1) \]

  • \(x\not= y\),我们可以枚举 \(b\) 然后分为两种情况讨论

\(\text{Case1:}\) \(x\)\(b\) 父亲,\(y\)\(b\) 儿子,贡献为

\[2\sum_{u\in\mathcal W}f_uh_u \]

\(\text{Case2:}\) \(x,y\)\(b\) 互不相同的儿子,贡献为

\[\sum_{u\in\mathcal B}\sum_{x\in\text{son}(u)}f(x)\sum_{y\in\text{son}(u)}f(y)-\sum_{x\in\text{son}(u)}f_x^2=\sum_{u\in\mathcal B}g_u^2-\sum_{u\in\mathcal W}f_u^2 \]

发现每次删点时只会改变 \(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\) 的循环卷积)

\[(1+\sum_{\text{opt}_i=0}x^{v_i})\prod_{\text{opt}_i=1}(1+x^{v_i}) \]

考虑背包 \(\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\) 的矩形交

\[(t+1)F(t)-\sum_{i=0}^tF(i)=(t+1)\sum_{\mathcal S}(-1)^{|\mathcal S|+1}(F(\mathcal S,t)-\sum_{i=0}^tF(\mathcal S,i)) \]

我们令 \(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}\)

考虑如何处理平方,可以转换

\[f(S)=\left(\sum_{p\subset S}w(p)\right)^2=\sum_{p\subset S}\sum_{q\subset S}w(p)w(q) \]

我们可以考虑有序路径对 \((p,q)\) 的贡献为 \(w(p)w(q)2^{n-|p\cup q|}\).

考虑 \(\text{DP}\),设 \(f(u,v)\) 为路径 \(p\) 终点为 \(u\),路径 \(q\) 终点为 \(v\) 的贡献,我们可以扩展 \(u\)\(u'\)\(v\) 同理),考虑转移式

\[f(u',v)=\dfrac 12f(u,v)\cdot w_{u'}[u'\not\in q]+f(u,v)\cdot w_{u'}[u'\in q] \]

如果我们要将 \(u'\) 是否属于路径 \(q\) 记录在状态上我们至少用 \(O(2^n)\) 的状态描述,但是 \(\text{DAG}\) 我们可以钦定合理转移顺序。具体我们每次钦定转移拓扑序较小的点转移即可。复杂度为 \(\mathcal O(n^2+m)\).

posted @ 2023-11-14 22:13  little_pinkpig  阅读(50)  评论(1)    收藏  举报