2025寒假专场5
501最年轻开始
模拟
502近似值
模拟
503病毒感染
求连通性,可以dfs, bfs, 并查集
504 蛋糕
枚举每一个草莓,利用二分确定是在哪个块当中!
假设草莓的位置是(x,y),那么草莓一定会出现在第一个比x大的平行x轴的切线 以及第一个比y大的平行y轴的切线 的方格内。
利用
特殊情况:最后统计的方格的数量有
#include<bits/stdc++.h>
using namespace std;
const int mxv = 2e5 + 9;
#define int long long
int w, h, n;
pair<int, int> p[mxv];
int a[mxv],b[mxv],cnta,cntb;
map<pair<int,int>, int> mp;
void solve(){
cin >> w >> h >> n;
for(int i = 1;i <= n; i++) cin >> p[i].first >> p[i].second;// 草莓位置
cin >> cnta;
for(int i = 1; i <= cnta; i++) cin >> a[i];
cin >> cntb;
for(int i = 1; i <= cntb; i++) cin >> b[i];
a[++cnta] = w; b[++cntb] = h;
sort(a + 1, a + 1 + cnta);
sort(b + 1, b + 1 + cntb);
for(int i = 1; i <= n; i++){
int x = p[i].first, y = p[i].second;
int xx = lower_bound(a + 1, a + 1 + cnta, x) - a;
int yy = lower_bound(b + 1, b + 1 + cntb, y) - b;
mp[{xx, yy}]++;
}
int min1 = 1e18, max1 = -1e18, cnt = 0;
for(auto t: mp){
int y = t.second;
min1 = min(min1, y);
max1 = max(max1, y);
cnt++;
}
if(cnt < cnta * cntb) min1 = 0;
cout << min1 << " " << max1 << "\n";
return;
}
signed main(){
int t=1;
while(t--) solve();
return 0;
}
505好图
并查集