2025.10.1 NOIP 模拟赛 题解
T1 P130026 圆 (circle)
题意
给定 \(n,m\) 和矩形 \((0\sim n,0\sim m)\) 内的 \(k\) 个点,求出有多少种方式选出四个不同的点 \(A,B,C,D\),使得以 \(A\) 为圆心过 \(B\) 的圆和以 \(C\) 为圆心过 \(D\) 的圆都在矩形内部,且后者严格位于前者内部,\(n,m\le1000,k\le4\),任意两点不重合
分析
容易做到 \(O(k^4)\),尽量用整数代替浮点运算以提高精度
T2 P130027 序列 (sequence)
题意
给定 \(n,k\),位置 \(1\sim k\),初始都是 \(0\),任选一个填上 \(1\),然后依次考虑 \(2\sim n\),将 \(i\) 填到 \(i-1\) 的相邻位置之一(覆盖原先的值),求最终得到的序列有多少种可能,\(n,k\le5000\)
分析
将填数的过程画成折线图,标出其中被覆盖部分,考虑每个极长的被覆盖段,用一个前缀完成平移,剩余后缀长度一定为偶数,用 \(\rightarrow,\leftarrow\) 交替替换之,称为填充
\ \ \
\ \ \
\ \ \
/ [/] /
\ [\] \
\ -> \ -> \
/ [/] /
\ [\] \
/ [/] /
/ [/] \
/ [/] /
---- ---- ----
\ \ \
\ \ \
/ [/] /
/ [/] /
/ / /
/ / /
\ -> [\] \
\ [\] \
\ [\] \
\ [\] \
\ \ \
/ [/] /
/ [/] \
----- ----- -----
显然变换后的折线和最终序列一一对应
枚举其中填充的数量(注意第一个可以不成对,因此对 \(n\) 和 \(n-1\) 分别求出方案数),令 \(f_{i,l}\) 表示长度为 \(i\),横向宽度为 \(l\),且不含填充的方案数,容易前缀和优化 \(dp\) 做到 \(O(nk)\)
统计答案时,枚举 \(i,l\),容易组合数求出插入填充的方案数(显然只有 \(l\) 个位置可以插入填充)
时间复杂度 \(O(nk)\)
T3 P130028 多边形 (polygon)
题意
给定一个 \(n\) 边形的三角剖分,定义一次变换为选择剖分中相邻的两个三角形,删去它们之间的边,并连接剩下两个点,\(q\) 次操作,每次对多边形进行一次变换,或给定一个顶点,查询至少进行多少次变换使得剖分出的所有三角形都以给定点为顶点并求出方案数,\(n\le2\times10^5\)
分析
考虑对于一次询问如何求出答案,设查询的点为 \(x\)
对于任意一条不和 \(x\) 相连的弦,都需要至少一次操作使得它和 \(x\) 相连,显然可以构造合法的操作顺序使得取到下界 \(n-3-deg(x)\),其中 \(deg\) 表示度数,容易 \(O(1)\) 维护之
然后考虑计算方案数
每条不过 \(x\) 的弦将圆分为两个弧,取不含 \(x\) 的一段,则这些弦只有包含关系和并列关系,容易用有根森林描述之
显然答案为森林的拓扑序数量,即 \(\frac{(n-3-deg(x))!}{\prod_u sz_u}\),用树状数组维护每个位置 \(x\) 的 \(\prod_u sz_u\),则一次修改可以转化为区间乘除
时间复杂度 \(O((n+q)\log n)\)
T4 P130029 道路维修 (road)
题意
给定 \(n\times m\) 的网格,部分边被激活,可以以 \(c_i(1\le i\le n)\) 的代价激活所有边 \(((i,j),(i,j+1))\mid (1\le j<m)\),\(q\) 次询问,给定一个点集,求使得点集中的点只经过激活的边连通最少需要的代价,或判定无解,询问之间独立,\(n\ge 2,m\ge 2,n\times m\le10^6,q\le10^5\),所有询问的点集大小之和 \(\le 2\times10^5\),\(c_i\in\{1,2\}\)
分析
求出初始的所有连通块,则进行 \(c_i\) 操作能连接所有和第 \(i\) 行有交的连通块
求出每个连通块的行的最小最大值,得到若干 \([1,n]\) 上的区间
转化为给定这些区间的一个子集(将给定的点集替换为它们所在连通块对应区间并去重),每个点有权值,选出权值和最小的点集,使得对于每个选出点将所有和它有交的区间合并后,所有给定区间都并在一起
特判只有一个区间的情况
将给定区间排序,只保留极小的(即不被其它区间包含的)
若剩下数量为 \(1\),则答案为该区间内 \(c\) 的最小值,用 \(\text{ST}\) 表即可
若剩下数量 \(>1\),则答案不变,从左到右依次排列
先考虑所有 \(c=1\) 的情况,显然从左往右扫描,每次跳到右端点,若直接跳到右端点会跳过某个给定区间,则跳到该给定区间的右端点,容易用倍增优化到 \(k\log n\),其中 \(k\) 为询问点集的大小
然后考虑 \(c=2\) 的情况,倍增时令 \(f_{i,j,0/1}\) 表示从 \(i\) 出发跳 \(2^j\;/\;2^j-1\) 次,最后一次选择位置的最大值,询问时记录答案,跳答案次最大位置,跳答案加一次的最大位置
时间复杂度 \(O(nm\alpha(nm)+(n+q)\log n)\)
比赛结果
\(100+100+0+0\),\(\text{rk}48\)

浙公网安备 33010602011771号