2024.11.28 NOIP 模拟赛 题解

T1 P10429 [蓝桥杯 2024 省 B] 拔河

题意

给定 \(a_{1\sim n}\),求 \(\min\limits_{1\le l_1\le r_1<l_2\le r_2\le n}\left|\sum_{i=l_1}^{r_1}a_i-\sum_{i=l_2}^{r_2}a_i\right|\)\(n\le1000,a_i\le 10^9\)

分析

\(s\)\(a\) 的前缀和数组

从右到左枚举 \(r_1\),先对于每个 \(l_1\le r_1\),在 \(S\) 中查询最接近 \(s_{r_1}-s_{l_1-1}\) 的数并跟新答案,再对于所有 \(r_2\ge r_1\),将所有 \(s_{r_2}-s_{r_1-1}\) 加入 \(S\)

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

代码

T2 P8083 [COCI2011-2012#4] OGRADA

题意

给定 \(a_{1\sim n}\)\(b_{1\sim n}\),求出 \(b\) 的一个排列 \(b'\),满足 \(\forall 2\le i\le n,[a_i<a_{i-1}]=[b'_i<b'_{i-1}]\),求 \(\sum_{i=2}^n |b'_i-b'_{i-1}|\) 的最大值,\(n\le 3\times10^5\)\(\forall i\ne j,a_i\ne a_j,b_i\ne b_j\)\(a_i,b_i\le 10^9\)

分析

\(mul_i=[i>1][a_{i-1}<a_i]+[i<n][a_i>a{i+1}]\),则 \(\sum_{i=2}^n |b'_i-b'_{i-1}|=\sum_{i=1}^n mul_i b'_i\)

因此需要将较大的 \(b'_i\) 放到 \(mul_i\) 较大的位置上,这容易通过对 \(b_i\) 的排序实现

对于 \(mul_i=0\) 的极大子区间,需要根据 \(a_i<a_{i-1}\) 决定是升序还是降序

可以证明这样填一定符合要求

时间复杂度 \(O(n\log n)\),瓶颈在于排序

代码

T3 P7985 [USACO21DEC] Paired Up P

题意

数轴上有 \(n\) 个点,分别在 \(x_{1\sim n}\),权值分别为 \(y_{1\sim n}\),其中 \(c_i='G'\) 的为一类点,其余为二类点。若一个一类点和一个二类点之间距离不超过 \(k\),则称两者可以匹配。定义配对为选出一类点的一个可空子集,将其中每个点和一个二类点匹配,满足没有参与配对的点集中任意两点都不能匹配。求不在配对中的点的 \(y\) 之和的可能的最大值和最小值。\(n\le 5000,0\le x_i\le 10^9,1\le y_i\le10^5\)

分析

先考虑求最小值

此时可以忽略是否满足 没有参与配对的点集中任意两点都不能匹配,因为如果存在两点没有参与配对且可以互相匹配,则这组配对的 \(\sum y\) 一定不是最大的

显然若一类点的一个子集和二类点的一个子集可以依次互相匹配,则将两者分别排序后一定也可以依次互相匹配(即后者成功的可能性不小于前者)

因此将两个点集分离出来,设一类有 \({la}\) 个,分别在 \({xa}_{1\sim {la}}\),权值分别为 \({ya}_{1\sim {la}}\),二类有 \({lb}\) 个,分别在 \({xb}_{1\sim {lb}}\),权值分别为 \({yb}_{1\sim {lb}}\)

\(f_{i,j}\) 表示在一类前 \(i\) 个和二类前 \(j\) 个中选择,非配对点权值和的最小值,则转移为

\[f_{i,j}=\begin{cases} \min(f_{i-1,j-1},f_{i-1,j}+{ya}_i,f_{i,j-1}+{yb}_j)&i\ne 0\land j\ne 0\land |{xa}_i-{xb}_j|\le k\\ \min(f_{i-1,j}+{ya}_i,f_{i,j-1}+{yb}_j)&i\ne 0\land j\ne 0\land |{xa}_i-{xb}_j|>k\\ f_{i-1,j}+{ya}_i&i\ne 0\land j=0\\ f_{i,j-1}+{yb}_j&i=0\land j\ne 0\\ 0&i=0\land j=0 \end{cases}\]

答案为 \(f_{{la},{lb}}\)

这部分时间复杂度为 \(O(n^2)\)

然后考虑求最大值

\(f_{i,j,0}\) 表示在一类前 \(i\) 个和二类前 \(j\) 个中选择,非配对点权值和的最大值,其中强制将一类的第 \(i\) 个选入配对

\(f_{i,j,1}\) 为强制将二类的第 \(j\) 个选入配对的答案

转移分为两类,一类是 \(f_{X,X,k}\rightarrow f_{X,X,k}\)(箭头表示前者对后者取 \(\max\)

这部分转移基本和求最小时 \(f_{i,j}\) 前四种转移相同

另一类是 \(f_{X,X,0}\rightarrow f_{X,X,1}\)\(f_{X,X,1}\rightarrow f_{X,X,0}\)

两者形式相同,因此只考虑前者

\(f_{a,b,0}\) 可以转移到 \(f_{x,y,1}\),则需要满足 \({xb}_y-{xa}_a>k\),且 \(\forall 1\le i\le x-a,|{xa}_{a+i}-{xb}_{b+i}|\le k\),且 \(x-a=y-1-b\)

\(t_{a,b}\) 为满足 \(\forall 1\le i\le t_{a,b},|{xa}_{a+i}-{xb}_{b+i}|\le k\) 的最大值

\(nxa_a\) 为满足 \({xb}_y-{xa}_a\le k\)\(y\) 的最大值

\(f_{a,b,0}\) 可以转移到 \(f_{x,y,1}\) 当且仅当 \(y>nxa_a,x-a=y-1-b,t_{a,b}\ge x-a,y>b\)

\(f_{a,b,0}\) 可以令所有 \(f_{y-1-b+a,y,1}\leftarrow f_{a,b,0}+{yb}_{y}\;(y>\max(nxa_a,b),t_{a,b}\ge y-1-b,x\le la,y\le lb)\)

\(p=y-b-1\),则上式转化为:

\[f_{p+a,p+b+1,1}\leftarrow f_{a,b,0}+{yb}_{p+b+1}\;(\max(nxa_a-b,0)\le p\le \min(t_{a,b},la-a,lb-b-1)) \]

为区间覆盖的形式

\(g_{x,y,1}\) 为所有覆盖中 \(f_{a,b,0}\) 最大的一个,当 \(dp\)\(x,y\) 时令 \(f_{x,y,1}\leftarrow g_{x,y-1,1}+yb_{y}\) 即可

则转化为

\[g_{p+a,p+b,1}\leftarrow f_{a,b,0}\;(\max(nxa_a-b,0)\le p\le \min(t_{a,b},la-a,lb-b-1)) \]

这是区间取 \(\max\) 的形式

\(Lm=\max(nxa_a-b,0),Rm=\min(t_{a,b},la-a,lb-b-1)\)

\[g_{p+a,p+b,1}\leftarrow f_{a,b,0}\;(Lm\le p\le Rm) \]

发现对于 \(p>Rm\) 时,\(g_{p+a,p+b,1}\) 一定不会对 \(f_{p+a-1,p+b,1}\) 产生影响

因此当区间不为空时,令 \(g_{Lm+a,Lm+b,1}\leftarrow f_{a,b,0}\) 即可

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

代码 部分参考了 ETHANK 的题解,部分参考 \(std\)

T4 P7230 [COCI2015-2016#3] NEKAMELEONI 加强版

题意

给定 \(a_{1\sim n}\;(1\le a_i\le k)\)\(m\) 次操作令 \(a_x\leftarrow y\),或查询最小的 \(p\),满足存在一个长度为 \(p\) 的区间,包含了 \(1\sim k\) 的所有值

分析

\(pre_i\)\(i\) 前面第一个和 \(a_i\) 值相同的位置,不存在则为负极大值

\(f_i\) 为满足 \(a_{f_i\sim i}\) 包含 \(1\sim k\) 的最大值

这等价于 \(a_{f_i\sim i}\) 包含 \(1\),且包含 \(2\),且包含 \(3\),······

\([l,r]\) 包含 \(x\) 等价于 \(l\le \min_{i>r,a_i=x}pre_i\)

因此 \(f_i=\min_{j=i+1}^n pre_j\)

但是当 \(i\) 以后不存在某个值时上述并不正确

因此令 \(a_{n+i}=i\;(1\le i\le k)\),则 \(f_i=\min_{j=i+1}^{n+k} pre_j\)

答案为 \(\min_{i=1}^n i-f_i+1\)

修改一个 \(a_x\) 后,至多改变三个位置的 \(pre\)

这容易通过 \(k\)set 维护

问题转化为修改 \(pre_x\),查询 \(\min_{i=1}^n i+1-\min_{j=i+1}^{n+k} pre_j\)

\(fst\) 为每种数字第一次出现的位置(若 \([1,n]\) 中不存在则为 \([n+1,n+k]\) 中出现位置)的集合,\(lst\) 为每种数字最后一次出现的位置(若 \([1,n]\) 中不存在则为负极大值)的集合

\(Lss\)\(fst\) 中最大值,\(Rss\)\(lst\) 中最小值

则当 \(Lss>n\) 时一定无解,否则上式等于 \(\min_{i=1}^n i+1-\min(Rss,\min_{j=i+1}^{n} pre_j)\)

建立线段树,用 \((k,L,R)\) 表示编号为 \(k\),保存的区间为 \([L,R]\) 的节点,堆式存储,用 \(M\) 表示 \([L,R]\) 的中点,左儿子包含 \([L,M]\),右儿子包含 \((M,R]\)

\(mnv_k=\min_{i=L+1}^R pre_i\),则叶节点的 \(mnv_k=\infty\),非叶子节点的 \(mnv_k=\min(mnv_{2k},pre_{M+1},mnv_{2k+1})\),单点修改 \(pre\) 后容易 \(O(\log n)\) 维护

\(lft_k=\min_{i=L}^{M}i+1-\min_{j=i+1}^R {pre}_j\)(之后会解释为什么这么定义)

定义 \(qry(p,l,r,k)=\min_{i=l}^r i+1-\min(p,\min_{j=i+1}^r pre_i)\),则 \(\min_{i=l}^r i+1-f_i=qry(\min_{i=r+1}^{n+k}pre_i,l,r,k)\),这样 \(\min_{i=r+1}^{n+k}pre_i\) 可以作为参数传递,减少一部分维护的复杂度

\(mnv_k\ge p\) 时,所有 \(\min_{j=i+1}^r pre_i\)\(\ge p\),上式等价于 \(\min_{i=l}^r i+1-p\),显然 \(i=l\) 时取到最小,因此此时返回 \(l+1-p\)

\(l=r\) 时,显然上式等于 \(l+1-mnv_k\)

否则需要递归计算

显然

\[\begin{aligned} qry(p,l,r,k)=&\min_{i=l}^r i+1-\min(p,\min_{j=i+1}^r pre_i)\\ =&\min(\min_{i=l}^M i+1-\min(p,\min_{j=i+1}^r pre_i),\min_{i=M+1}^r i+1-\min(p,\min_{j=i+1}^r pre_i))\\ =&\min(qry(\min(p,mnv_{2k+1},pre_{M+1}),l,M,2k),qry(p,M+1,r,2k+1)) \end{aligned}\]

其中 \(M\) 为区间中点

\(mnv_{2k+1}<p\) 时,\(qry(\min(p,mnv_{2k+1},pre_{M+1}),l,M,2k)=qry(\min(mnv_{2k+1},pre_{M+1}),l,M,2k)=lft_k\),只需要递归右儿子即可(这也是前文 \(lft\) 定义奇怪的原因)

否则 \(qry(p,M+1,r,2k+1)=\min_{i=M+1}^r i+1-\min(p,\min_{j=i+1}^r pre_i)\),而 \(\min_{j=i+1}^r pre_i\ge mnv_{2k+1}\ge p\),因此可以化为 \(\min_{i=M+1}^r i+1-p\),显然 \(i=M+1\) 时最小,\(qry(p,M+1,r,2k+1)=M+2-p\)

综上,若可以维护 \(lft\),则每次至多递归一个儿子,计算 \(qry(p,l,r,k)\) 的时间复杂度为 \(O(\log(r-l+1))\)

\(lft_k=qry(\min(mnv_{2k+1},pre_{M+1}),l,M,2k)\),显然其计算只依赖线段树上其子树内的信息,需要跟新 \(lft_k\) 时其子树内的信息一定都计算好了(buildpush_up),因此直接用 \(qry\) 计算即可,单次 \(O(\log(r-l+1))\),建树时总计 \(O(n\log n)\),跟新一个 \(pre\) 时为 \(O(\log^2n)\)

显然 \(\min_{i=1}^n i+1-\min(Rss,\min_{j=i+1}^{n} pre_j)=qry(Rss,1,n,1)\)

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

代码 参考了比赛 \(std\),并去掉 \(std\) 中一部分无用代码

比赛结果

\(100+100+45+15\),符合预期

posted @ 2024-11-29 15:35  Hstry  阅读(27)  评论(0)    收藏  举报