2025.3.26 NOI 模拟赛 题解

比赛:div1 div2

div2 T1 #P10208. 模糊的线性组合

题意

给定 \(a_{1\sim n}\;(a_i\in\mathbb Z)\)\(q\) 次询问,每次给定 \(k\),求有多少非空区间 \([l,r]\),满足存在 \(c_{l\sim r}\;(c_i\in\mathbb Z)\),使得 \(\sum_{i=l}^r a_ic_i=k\)\(n,q\le10^5,1\le a_i\le10^9,1\le k\le 10^6\)

分析

区间 \([l,r]\) 合法当且仅当 \((\gcd_{i=l}^r a_i)\mid k\)

因此转化为求 \(\sum_{1\le l\le r\le n}[(\gcd_{i=l}^r a_i)\mid k]\)

对于每个 \(r\)\(\gcd_{i=l}^r\) 相等的 \(l\) 分为 \(O(\log V)\) 段,令 \(cnt_u=\sum_{1\le l\le r\le n}[(\gcd_{i=l}^r a_i)=u]\),将所有 \(O(n\log V)\) 段都计入 \(cnt\) 中,然后令 \(cnt_x\gets \sum_{u\mid x}cnt_u\),每次可 \(O(1)\) 回答询问

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

代码

div1 T1 div2 T2 #P1361. 微操

题意

两个长为 \(k\)\(0/1\)\(s^1\)\(s^2\)\(n\) 个操作 \(op_i=(x_i,y_i)\) 表示交换 \(s^1_{x_i}\)\(s^1_{y_i}\),令 \(s\times op_i\) 表示操作 \(i\) 作用到 \(0/1\)\(s\) 上的结果,令 \(\text{M}(s^1,s^2)=\sum_{i=1}^k [s^1_i=s^2_i]\),求出 \(\max_{1\le l\le r\le n,r-l+1\ge m}\text M(s^1\times\prod_{i=l}^r op_i,s^2)\)\(m\le n\le10^6,k\le20\)

分析

类似差分,\(\text M(s^1\times\prod_{i=l}^r op_i,s^2)=\text M(s^1\times\prod_{i=l}^n op_i,s^2\times\prod_{i=r+1}^n op_i)\)

\(\text {compr}(s)\) 表示将 \(s\) 压缩为 \([0,2^k)\) 内整数的结果

预处理 \(f_s=\min (l\mid \text{compr}(s^1\times\prod_{i=l}^n op_i)=s)\)\(g_s=\max (r\mid \text{compr}(s^2\times\prod_{i=r}^n op_i)=s)\),容易 \(O(n)\)\(O(nk)\) 计算,注意从后往前推时要记录位置的置换

则答案为

\[\max_{0\le s,t<2^k} [g_t-f_s\ge m]\text{M}(\text{compr}^{-1}(s),\text{compr}^{-1}(t)) \]

对于非负整数 \(a,b\),定义 \(a\subseteq b\) 表示 \(a\) 二进制表示下为 \(1\) 的位为 \(b\) 的子集,\(a\cap b,|a|,\complement_U a\) 等运算同理

\(\text M(\text{compr}^{-1}(s),\text{compr}^{-1}(t))=|s\cap t|+|(\complement_Us)\cap (\complement_Ut)|=|s\cap t|+k-|s\cap t|-(|s|-|s\cap t|)-(|t|-|s\cap t|)=k+2|s\cap t|-|s|-|t|\),其中 \(k-|s|-|t|\) 为常数,因此要最大化 \(|s\cap t|\)

转化为求

\[\max_{0\le s,t<2^k} [g_t-f_s\ge m]|s\cap t| \]

等价于

\[\max_{0\le u<2^k,((\exists 0\le s,t<2^k,u\subseteq s,u\subseteq t),g_t-f_s\ge m)}|u| \]

\(g\)\(f\) 做高维前缀和,即令 \(g_u\gets \max_{u\subseteq s}g_s\)\(f_u\gets \min_{u\subseteq s}f_s\),则答案为

\[\max_{0\le u<2^k,g_u-f_u\ge m}|u| \]

总时间复杂度 \(O(n+k2^k)\)

代码

参考

div1 T2 div2 T3 #18044. 弹球

题意

一个 \(n\times m\) 的网格,其中 \(k\) 个格子为关键位置,其中每条线段都有收益,要在网格中放置若干回路,要求回路经过所有关键点,回路的每段折线的长都为 \(1\),最大化穿过的线段的总收益,\(n\le30,m\le30\),多测 \(t\le50\),收益有正负

分析

对网格黑白染色,则每条回路都是黑白相间

设黑点从左右进上下出,白点左右出上下进,则每个点的出度和入度都是 \(1\)

考虑费用流

\(n\times m\) 个点,每个点 \((i,j)\) 拆为左部点 \(l(i,j)\) 和右部点 \(r(i,j)\)

令源汇为 \(S,T\),则 \(S\to^0 l(i,j),T\to^0 r(i,j)\)(容量都是 \(1\),角标为费用)

对于非关键点 \((i,j)\)\(l(i,j)\to^0 r(i,j)\)

对于一对邻点 \((i,j)\)\((x,y)\),假设根据黑白染色结果是 \((i,j)\to (x,y)\),则费用为两者之间线段的收益

求出网络的最大费用最大流,若最大流不为 \(n\times m\) 则无解,否则答案为最大费用

时间复杂度 \(O(\sum (nm)^3)\)

代码

参考

div1 T3 #18045. 桥

比赛结果

\(100+25+35+61\)\(\text{div1}\) \(\text{rk}23\)\(\text{div2}\) \(\text{rk}3\)

posted @ 2025-03-27 07:05  Hstry  阅读(6)  评论(0)    收藏  举报