专栏文章
2025寒假专场5
题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @miqjx6n7
- 此快照首次捕获于
- 2025/12/04 06:01 3 个月前
- 此快照最后确认于
- 2025/12/04 06:01 3 个月前
模拟
模拟
求连通性,可以dfs, bfs, 并查集
枚举每一个草莓,利用二分确定是在哪个块当中!
假设草莓的位置是(x,y),那么草莓一定会出现在第一个比x大的平行x轴的切线 以及第一个比y大的平行y轴的切线 的方格内。
利用对每个草莓进行统计,然后再找出那个方格的数量最少喝最多就可以。
特殊情况:最后统计的方格的数量有个方格存在草莓,若则,说明最小值为.
CPP#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;
}
并查集
对不能连通的点,意味着他们所处的集合是不能相通。
每次添加都是独立的,求解的问题是单独的。
每天添加一条边,只要检查看看,这两个集合是否是可以相通的即可。
CPP#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int n, m, k, q;
int fa[N];
map< pair<int, int>, int > mp;
int find(int x){
if(x != fa[x]) return fa[x] = find(fa[x]);
return x;
}
void merge(int u, int v){
u = find(u), v = find(v);
if(u != v) fa[u] = v;
}
void solve(){
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++) fa[i] = i;
for(int u, v, i = 1; i <= m; i++){
scanf("%d%d", &u, &v);
if(u == v) continue;
merge(u, v);
}
scanf("%d", &k);
for(int x, y, i = 1; i <= k; i++){
scanf("%d%d", &x, &y);
int xx = find(x), yy = find(y);
mp[{xx, yy}] = -1;
}
scanf("%d", &q);
while(q--){
int x, y;
scanf("%d%d", &x, &y);
int xx = find(x), yy = find(y);
if(mp[{xx, yy}] != -1 && mp[{yy, xx}] != -1)
puts("Yes");
else
puts("No");
}
}
int main(){
solve();
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...