NOI 2019 补全记录

发布时间 2023-10-20 09:57:39作者: Xun_Xiaoyao

D1T1 回家路线

好久之前写的,忘了具体细节,但是发现有平方项所以考虑拆项之后斜率优化。

D1T2 机器人

考虑 DP。
\(f_{l,r,i}\) 表示 \([l,r]\) 这段区间,最大值为 \(i\) 的方案数,同时记 \(g_{l,r,i}=\sum\limits_{j=1}^if_{l,r,i}\)
由于向左可以走到 \(\le h_s\) 的,向右可以走到 \(< h_s\) 的。
所以我们找到 \(h_i\) 最大的位置中编号最大的,除非以这个位置为起点,则没有任何一个机器人会到达这个位置。
考虑枚举这个最高点,则有 \(f_{l,r,i}=\sum\limits_{|(r-j)-(j-l)|\le 2\land l_j\le i\le r_j}g_{l,j-1,i}g_{j+1,r,i-1}\)
初始化 \(f_{i,i-1,0}=1\)

则这个转移是 \(O(n^2V)\) 的(转移枚举量看作 \(O(1)\)),我们考虑如何优化它。
考虑从转移的两个限制下手:
由于有 \(|(r-j)-(j-l)|\le 2\),考虑到最终对 \(f_{1,n,*}\) 做贡献的区间不会取遍 \(O(n^2)\) 个,所以考虑从 \(1,n\) 开始深搜,发现极限数据下 \(S\approx 2000\)
这样复杂度可以做到 \(O(SV)\),但是 \(V\) 仍然很大。

\(n\) 个数的取值将值域划分成了 \(O(n)\) 个不同的区间
通过感性的理解,在每个区间内 \(g_{l,r,i}\) 应该会是一个关于 \(i\)\(O(n)\) 次多项式(其实可以认为 \(g_{l,l,i}\) 是关于 \(i\) 的一次式,在通过转移式子可知 \(g_{l,r,i}\) 至多是一个 \(r-l+1\) 次多项式)。
而当前区间和下一个区间有关的只有最后一项,所以我们可以使用拉格朗日插值求出最后一项是多少。
这样的时间复杂度为 \(O(n^2S)\)

D1T3 序列

感觉这个东西很反悔贪心,我们考虑建出它的费用流模型。

至少有 \(L\) 对相同,也就是最多有 \(K-L\) 对不相同。
\(S\) 为源点,\(T\) 为汇点,\(A_i\) 表示第一个序列上的第 \(i\) 个点,\(B_i\) 表示第二个序列上的第 \(i\) 个点,以及两个特殊节点 \(P,Q\)
记一条有向边信息为 \((u,v,f,w)\) 表示从 \(u\)\(v\),流量为 \(f\),费用为 \(w\) 的有向边。
则需要连边:
\((S,A_i,1,a_i)\)\((A_i,B_i,1,0)\)\((B_i,T,1,b_i)\)\((A_i,P,1,0)\)\((P,Q,K-L,0)\)\((Q,B_i,1,0)\)

考虑枚举费用流可能的增广路径,发现有 \(5\) 中可能的路径,使用堆维护即可。

D2T1 弹跳

可以从一个点跳到一个矩形,类似最短路模型。
使用 KDT 维护当前到达每个点的最短距离,每次使用没有增广过且距离最短的增广,时间复杂度 \(O(n\sqrt{n})\)

D2T2 斗主地

找规律之后发现,假设洗牌前牌对应一个 \(k\) 次函数 \(f(i)\) 洗牌之后的函数 \(g(i)\) 仍为 \(k\) 次函数,所以每一次暴力 DP 出前 \(k+1\) 项的值,然后拉格朗日插值即可。

D2T3 I 君的探险

测试点 \(1\sim 5\):每一个点 modify 一次,暴力检查每个点是否被反转了,如果被反转了,说明有连边。
测试点 \(6\sim 17\):图是一个树形态,我们通过二进制分组来得到每一个点相连的点的异或和,我们每一次尝试找到一个叶子(特殊形式 A B 可以直接取当前还有连边的最大的)将其和父亲相连,递归这个过程即可。
测试点 \(18\sim 25\):考虑整体二分,先随机打乱序列,然后找到向前连了奇数条边的点,找到他们连的边。