洛谷 NOIP 计划 2026 前期 模拟考试 5-8
模拟赛 5
T1
有 \(n\) 块农田排成一行,第 \(i\) 块农田的干旱程度为 \(a_i\)。现在有 \(m\) 个喷水器,第 \(i\) 个喷水器位于坐标 \(p_i\) 处。
所有喷水器的喷水半径相同,设为 \(r\)(\(r\) 为非负整数)。如果第 \(i\) 块农田与第 \(j\) 个喷水器的距离 \(\le r\),则认为第 \(i\) 块农田被第 \(j\) 个喷水器覆盖。第 \(i\) 块农田获得的灌溉量等于覆盖它的喷水器数量。
要求每块农田的灌溉量 大于等于 其干旱程度 \(a_i\)。特别地,如果某块农田干旱程度为 \(0\),则不对其灌溉量做任何要求。
你需要求出一个最小的非负整数 \(r\),使得存在一种安装喷水器的方案,能够满足所有农田的灌溉需求。喷水器的位置已经固定,不能移动。
两块相邻农田的距离为 \(1\) 单位长度。第 \(i\) 块农田的坐标即为 \(i\)。第 \(j\) 个喷水器位于坐标 \(p_j\) 处。
\(1 \le n, m \le 2 \times 10^5\),\(0 \le a_i \le m\),\(1\le p_i\le n\)。
sol
简单二分答案。尝试二分 \(r\),check 使用差分维护即可。
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m;
int a[200005];
int p[200005];
int s[200005];
void add(int l,int r){
s[l]++;
s[r+1]--;
}
bool check(int x){
for(int i=1;i<=n;i++){
s[i]=0;
}
for(int i=1;i<=m;i++){
add(max(p[i]-x,1ll),min(p[i]+x,n));
}
for(int i=1;i<=n;i++){
s[i]=s[i-1]+s[i];
if(s[i]<a[i]) return 0;
}
return 1;
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=m;i++){
cin>>p[i];
}
int l=0,r=n,ans=-1;
while(l<=r){
int mid=(l+r)/2;
if(check(mid)) r=mid-1,ans=mid;
else l=mid+1;
}
cout<<ans;
return 0;
}
T2
B 国有 \(n\) 座城市,有 \(m\) 条双向道路连接着这些城市。城市编号为 \(1\) 到 \(n\),道路编号为 \(1\) 到 \(m\)。经由这些道路,从 B 国中任意一个城市出发,均能到达其他所有城市。此外,保证有 \(\color{red}{m \le n}\)。
由于能源不足,B 国的第 \(i\) 条道路只能正常运行 \(d_i\) 个时刻。现在云浅需要给每一条道路选择一个开始运行的时间 \(s_i\),那么这条道路就会在 \([s_i, s_i + d_i - 1]\) 这些时刻内正常运行。保证 \(d_i \ge 1\)。
B 国的大守护者布洛妮娅想要让国家在尽可能长的一段时间内保持连通。形式化地,对于云浅选择的一种方案 \(s_1, s_2, \cdots, s_m\),定义其连通度为最大的正整数 \(A\),使得对任意的 \(i = 1, 2, \cdots, A\),在第 \(i\) 个时刻,从 B 国的任意一个城市出发,只通过当前时刻仍在正常运行的道路,仍然可以到达任意另一个城市。大守护者希望找到连通度最大的方案。
随着 B 国的发展,现在 B 国已经可以对道路进行有限的能源扩充。具体地,大守护者可以给第 \(i\) 条道路扩充 \(a_i\) 个单位的能源,使得其最大运行时间 \(d_i\) 增大为 \(d_i + a_i\)。由于能源有限,\(a_1 + a_2 + \cdots + a_m\) 的值不能超过给定的正整数 \(L\)。大守护者想让你协助她找到一种扩充能源的方案 \(a_1, a_2, \cdots, a_m\),使得在扩充能源后,可能的最大连通度尽可能大。你只需要输出可能的最大连通度即可。
对于所有数据,有:
- \(1 \le T \le 10^5\),\(2 \le n \le 2 \times 10^5\),\(2 \le \sum n \le 10^6\),\(\color{red}m \le n\);
- \(0 \le L \le 10^9\),\(1 \le d_i \le 10^9\),\(u_i \neq v_i\)。
- 特殊性质 A:\(m = n - 1\)。
- 特殊性质 B:\(L = 0\)。
- 特殊性质 C:\(L \le 1\)。
- 特殊性质 D:\(m = n\),对任意 \(1 \le i < n\),\(u_i = i, v_i = i + 1\),且 \(u_n = n, v_n = 1\)。
sol
设最大连通度为 \(k\)。
观察到 \(m \le n\) 并且为连通图,故只为树或者基环树。
如果 \(m = n-1\),则为一棵树,断掉一条边整个图则会不连通。所以每条边的 \(d_i \ge k\),即需要增加的代价为 \(\max(0,d_i-k)\),直接计算即可。
如果 \(m = n\),则为一颗基环树,仅包含一个环。不难发现,在 \(k\) 个时间内,这条环上的边最多只能有一条不在运行,否则环将断裂。
OI / C++ / Algorithm
懒惰者出局。

浙公网安备 33010602011771号