2025.6.27 NOI 模拟赛 题解

比赛

T1 #P1254. 倍杀 \(\quad\) SP707 TFSETS - Triple-Free Sets

题意

给定 \(n\),求出 \(\sum_{S\subseteq([1,n]\cap\mathbb N)}[\exists x\in S,2x\in S\land 3x\in S]\)\(n\le5\times10^7\),多测 \(t\le5\)

分析

显然等于 \(2^n-\sum_{S\subseteq([1,n]\cap\mathbb N)}[\forall x\in S,2x\notin S\lor 3x\notin S]\),考虑如何计算 \(\sum_{S\subseteq([1,n]\cap\mathbb N)}[\forall x\in S,2x\notin S\lor 3x\notin S]\)

建立 \(n\) 点的图,\(x\to 2x\)\(x\to 3x\),则转化为给图黑白染色,使得不存在 \(x,2x,3x\) 同时染黑色,求染色方案数

每个 \(i\) 分解为 \(i=2^p\times 3^q\times r\),其中 \(p\) 为满足 \(2^p\mid i\) 的最大值,\(q\) 为满足 \(2^q\mid i\) 的最大值,\(2\nmid r,3\nmid r\),记为 \((p,q,r)\)

\((p,q,r)\) 连向 \((p+1,q,r)\)\((p,q+1,r)\)\(2^p3^qr\le n\)\((p,q,r)\) 存在

显然每个 \((\ast,\ast,r)\) 之间独立,考虑其中一个

其形状类似杨表,要计算其染色方案数

从下到上考虑每一行,令 \(f_s\) 表示前一行染色为 \(s\) 的方案数,\(g_s\) 表示当前行染色为 \(s\) 的方案数,其中 \(s\) 为一个集合,保存了染为黑色的位置

对于 \(g_s\),令 \(p=\{x\mid x\in s\land x+1\in s\}\),则 \(p\) 中的位置可以染为黑色,即 \(g_s\gets f_t\mid t\subseteq p\)

总时间复杂度 \(O(t(n+\log_2 n\log_3 n\times \log_2 n \log_3 n2^{\log_3 n}))=O(t(n+n^{\log_32}\log^4 n))\),需要一定程度的卡常

代码

T2 #P1255. 展望 \(\quad\) P11750 「TPOI-1D」谢谢您。

题意

给定 \(a_{1\sim n},l_{1\sim m},r_{1\sim m}\)\(q\) 次询问,每次给定 \(L,R,k\),求出 \(\max_{L\le i\le R}\sum_{l_i\le x\le r_i}[a_x=k]\)\(n,m,q\le2\times10^5\)

分析

考虑根号分治,令阈值为 \(S\)

\(p_k\)\(a\) 中值 \(k\) 出现位置的集合

对于 \(|p_k|>S\) 的询问,枚举 \(k\)(这样的 \(k\) 不超过 \(\frac nS\) 个),对于每个 \(k\)\(O(n)\) 求出每个前缀中 \(k\) 的数量,据此 \(O(m)\) 求出每个 \([l_i,r_i]\) 的答案,建立线段树,然后枚举对应的询问处理,这部分时间复杂度 \(O(\frac nS(n+m)+q\log m)\)

然后考虑 \(|p_k|\le S\) 的询问

一组询问 \((L,R,k)\) 的答案,等于枚举 \(u\in p_k\),求出 \(v=\max_{L\le i\le R,l_i\le u}r_i\)\(\sum_{i=u}^v [a_i=k]\) 的最大值

\(1\)\(n\) 扫描,设目前扫描到 \(x\),维护 \(b_{1\sim m}\mid b_j=[l_j\le x]r_j\),则每到一个新的 \(x\),先枚举 \(l_i=x\)\((l_i,r_i)\)\(b_{i}\gets r_i\),然后枚举询问 \((L,R,k)\mid k=a_x\),令其答案对 \(cnt(i,\max_{L\le i\le R}b_i,a_i)\)\(\max\),其中 \(cnt(L,R,v)\) 表示 \(a[L:R]\)\(v\) 的数量

\(b\) 的修改为 \(m\) 次单点取 \(\max\)\(O(Sq)\) 次求区间 \(\max\),分块套 \(\text{ST}\) 表维护 \(b\),做到 \(O(\sqrt m)\) 修改,\(O(1)\) 查询

每个 \(cnt\) 容易 \(O(\log n)\) 求出,发现对于一个询问,其对应的 \(cnt(L,R,k)\)\(L\)\(R\) 分别单调递增,双指针即可,总移动距离为 \(O(qS)\)

这部分时间复杂度 \(O(m\sqrt m+qS)\)

总时间复杂度 \(O(\frac nS(n+m)+q\log m+m\sqrt m+qS)\),空间复杂度 \(O(\sqrt m(\sqrt m\log\sqrt m)+n+q)=O(m\log m+n+q)\),取 \(S=\sqrt{\frac{n(n+m)}q}\) 可做到 \(O(q\log m+m\sqrt m+\sqrt{qn(n+m)})\)

代码

T3 #P1256. AT_arc616_byd \(\quad\) CF1621I Two Sequences 加强版

题意

对于 \(a_{1\sim n}\),定义对 \(a\) 的一次操作为依次考虑 \(l=1\sim n\),用 \(a\) 中长为 \(l\) 的字典序最小的子串覆盖最后 \(l\) 个位置,\(q\) 次询问 \((x,y)\),求出 \(x\) 次操作后的 \(a_y\)\(a_i,x,y\le n\le4\times10^5,\;q\le10^6\)

分析

考虑其中一个 \(l\) 的操作

设选择的为 \([x,x+l)\),则 \(\forall 0\le i<l,a_{n-l+i}\gets a_{x+i}\),等价于把 \(a[x,n-l]\) 复制一份插入它之后,然后保留前 \(n\) 个值,等价于用 \(a[x,n-l+1]\) 替换 \(a_{n-l+1}\) 后保留前 \(n\) 个值,等价于选择 \(a[1,n-l+1]\) 的任意非空后缀替换 \(a_{n-l+1}\) 后保留前 \(n\) 个值

显然选择的子串字典序最小等价于变换后的 \(a\) 字典序最小,因此对于一个 \(l\),它对 \(a\) 的改变为:选择 \(a[1,n-l+1]\) 的任意非空后缀替换 \(a_{n-l+1}\) 后保留前 \(n\) 个值,使得变换后的 \(a\) 最小

因此一次操作转化为依次考虑 \(l=n\sim 1\),选择 \(a[1,l]\) 的任意后缀替换 \(a_l\) 后保留前 \(n\) 个值且使得变换后字典序最小

此时每个 \(l\) 独立,一次操作转化为:对于每个 \(1\le i\le n\) 选择一个 \(1\le f_i\le i\),选好后对于每个 \(1\le i\le n\)\(a_i\) 替换为 \(a[f_i,i]\)(替换同时进行),只保留前 \(n\) 个值,使得变换后的字典序最小

从后往前考虑每个 \(f_i\),令 \(mn_i\)\([1,i]\) 的最小后缀,令 \(c_i\) 为满足 \((mn_i)^{c_i}\)\([1,i]\) 的后缀 的最大值,可证 \(f_{i+1}=i+1\)\(f_i=i-|mn_i|+1\),否则 \(f_i=i-c_i|mn_i|+1\)(显然 \(f_n\) 取两者最终得到的序列相同)

问题转化为求出 \(|mn_i|\)\(c_i\)

求出 \(|mn_i|\)\(c_i\) 可二分解决,具体地设二分的值为 \(x\),若 \(a[i-|mn_i|x+1,i-|mn_i|]=a[i-|mn_i|(x-1)+1,i]\)\(c_i\ge x\),否则 \(c_i<x\)

因此考虑如何求出 \(|mn_i|\)

求出后缀数组,令 \(p_i=\min_{j=1}^i rk_j\) 表示 \([1,i]\) 中对应后缀字典序最小的位置,则 可证 \(mn_i\)\([p_i,i]\) 的最短 \(\text{Border}\)(此处 \(\text{Border}\) 可包含原串,下同)

\(1\sim n\) 的顺序枚举 \(i\),维护 \(S=\{j\mid a[j,i]\text{ is Border of }a[p_i,i]\}\),则 \(|mn_i|=i-\max S+1\),维护方式为先加入 \(i\),然后删除最大值直到最大值对应位置合法(即用栈保存 \(S\)

可证 有效操作次数不超过 \(O(\log\log n)\),因此时间复杂度 \(O(n\log n\log\log n+q)\)

代码

参考

比赛结果

\(25+30+25\)\(\text{rk}11\)

posted @ 2025-06-28 19:41  Hstry  阅读(18)  评论(0)    收藏  举报