2025.3.25 NOI 模拟赛 题解

比赛:div1 div2

div2 T1 #P10268. 除法

题意

给定序列 \(a_{1\sim n}\)\(q\) 次操作单点修改,或给定 \(y\)\(\sum_{i=1}^n (\lfloor\frac y{a_i}\rfloor+(y\bmod {a_i}))\)\(n,q\le10^5,a_i\le2\times10^5\)

分析

拆为求 \(\sum_{i=1}^n\lfloor\frac y{a_i}\rfloor\)\(\sum_{i=1}^na_i\lfloor\frac y{a_i}\rfloor\),发现答案只和 \(a_i\) 构成的可重集有关

使用类似数论分块的方式,每次查询拆为 \(O(\sqrt V)\) 次求区间和,每次修改拆为 \(O(1)\) 次单点修改

可值域分块做到 \(O(q\sqrt V)\),树状数组的 \(O(q\sqrt V\log V)\) 也可过

代码

相似题

div1 T1 div2 T2 #18037. 哈密顿

题意

一张图 \(n\) 个点为 \(0\sim n-1\)\(i\)\(2i\bmod n\)\((2i-1)\bmod n\) 连有向边,对于所有 \(2\mid n,n\le 500\) 分别求出图的一条哈密顿回路或判定无解

分析

方法 1

暴力搜索,在本地求出答案,总输出量在 \(150\text K\) 左右,本题码长限制在 \(128\text K\),可通过一定方式压缩输出卡码长

方法 2

建立反图,在反图上求,时间复杂度未知但可过,需要逆序输出

代码

方法 3

\(n=500\) 时合法的回路数量大约有 \(0.18\%\),每次随一条可过

参考

方法 4

发现 \(x\)\(x+\frac n2\) 的出边相同,即两条边分别分配给两个点,建立 \(\frac n2\) 个点 \(n\) 边的图,连边方式相同,求出这张图的欧拉回路,对应原图上的哈密顿回路,时间复杂度 \(O(\sum n)\)

参考

div1 T2 div2 T3 #18038. 树

题意

给定一棵树,每个点有权值 \(d_i\),对于每个 \(i\),求出 \(\sum_{j=1}^n [\exists x,\text{dis}(i,x)\le d_x\land \text{dis}(j,x)\le d_x]\)\(n\le10^6\)

分析

对于每条边 \((u,v)\),令 \(d_u\gets\max(d_u,d_v-1)\)(这一过程通过类似 \(\text{dijkstra}\) 的过程实现)

经过转化答案显然不变,但是原本的条件 \([\exists x,\text{dis}(i,x)\le d_x\land \text{dis}(j,x)\le d_x]\) 可加强为 \([\exists x\in\text{path}(i,j),\text{dis}(i,x)\le d_x\land \text{dis}(j,x)\le d_x]\)

于是对于每组 \((i,j)\) 是否合法,只需要考虑路径 \(i-j\) 即可

考虑点分治,设分治中心为 \(Md\),需要处理 \(i=Md\lor j=Md\)\(i,j\)\(Md\) 不同子树内的 \((i,j)\)

\(Md\) 的子树为 \(St_{1\sim c}\),令 \(dep_u\) 表示 \(u\)\(Md\) 的距离

则对于每个 \(i\in St_x\;(1\le x\le c)\),需要求出

\[\sum_{j\in St_y,x\ne y}[(\exists u\in \text{path}(i,Md),dep_i-dep_u\le d_u\land dep_j+dep_u\le d_u)\lor(\exists u\in\text{path}(j,Md),dep_j-dep_u\le d_u\land dep_i+dep_u\le d_u)] \]

考虑对于每个 \(i\in St_x\) 求出 \(a_i=\max_{u\in\text{path}(i,Md),dep_i-dep_u\le d_u}d_u-dep_u\),则上述条件转化为

\[\sum_{j\in St_y,x\ne y}[a_i\ge dep_j\lor a_j\ge dep_i] \]

\(St=\bigcup_{i=1}^c St_i\),可拆为

\[\sum_{j\in St}[a_i\ge dep_j\lor a_j\ge dep_i]-\sum_{j\in St_x}[a_i\ge dep_j\lor a_j\ge dep_i] \]

因此原问题拆为两个子问题:对于每个 \(i\in St_x\),求出 \(a_i\);给定集合 \(S\),对于每个 \(i\in S\) 求出 \(\sum_{j\in S}[a_i\ge dep_j\lor a_j\ge dep_i]\)

先考虑前者

在对 \(St_x\) \(\text {dfs}\) 的过程中,令 \(cu\) 为当前遍历到的点,维护 \(ft_i=\max_{u\in\text{path}(cu,Md),d_u+dep_u=i}d_u-dep_u\),则 \(a_{cu}=ft_{dep_{cu}}\)

\(mxdp=\max_{u\in St_x}dep_u\)

\(fa_u\) 为取 \(Md\) 为根时 \(u\) 的父亲,由于 \(d_{fa_u}-1\le d_u\)\(dep_u=dep_{fa_u}+1\),可得

\[d_u-dep_u\le d_{fa_u}-dep_{fa_u} \]

\[d_{fa_u}+dep_{fa_u}\le d_u+dep_u \]

因此从 \(fa_u\)\(u\) 后,只要令 \(ft\) 的区间 \((\min(mxdp,d_{fa_u}+dep_{fa_u}),\min(mxdp,d_u+dep_u)]\) 赋为 \(d_u-dep_u\) 即可,对于一个 \(St_x\) 时间复杂度为 \(O(|St_x|)\)

然后考虑后者

显然为静态二维偏序问题,可以 \(O(|S|\log |S|)\) 解决,这样总时间复杂度为 \(O(n\log^2 n)\),可能可以过

考虑优化最后一部分

发现 \([a_i\ge dep_j\lor a_j\ge dep_i]\) 等价于 \([(dep_i\le dep_j\land dep_i\le a_j)]+[(dep_i>dep_j\land a_i\ge dep_j)]\),而两者都可前缀和优化到 \(O(|S|)\)(因为 \(mxdp=O(|S|)\)

这样总时间复杂度为 \(O(n\log n)\)

代码

参考

div1 T3 #18039. 扑克牌

题意

一个隐藏数组 \(a_{1\sim n}\)\(2\mid n\)\(1\sim n\frac n2\) 各有两个,一次询问 \((x,y)\) 会返回 \(\{a_x\}\cup\{a_y\}\) 并随机交换两者,通过不超过 \(92000\) 次询问确定目前为止的序列,\(n\le10^5\)

分析

存在若干 \(\text{hack}\) 交互库的做法:1 2 3

正解

比赛结果

\(100+100+30+20\)\(\text{div1}\) \(\text{rk}24\)\(\text{div2}\) \(\text{rk}1\)

posted @ 2025-03-25 21:07  Hstry  阅读(17)  评论(0)    收藏  举报