2020牛客暑期多校训练营(第八场)I Interesting Computer Game
2020牛客暑期多校训练营(第八场)I Interesting Computer Game
题解:
用并查集写即可。
#include <bits/stdc++.h>
#define debug(x) cout<<"debug:"<<" "<<#x<<"="<<x<<endl;
using namespace std;
const int maxn = 4e5+10;
int f[maxn],val[maxn];
int v[maxn],a[maxn],b[maxn];
int find(int x){
return x == f[x]?x:f[x] = find(f[x]);
}
void unite(int x,int y){
x = find(x);
y = find(y);
if(x==y) return ;
f[x] = y;
val[y]+=val[x];
val[x] = 0;
}
bool same(int x,int y){
return find(x) == find(y);
}
int cnt[maxn];
int main() {
int T;
scanf("%d", &T);
for (int cas = 1; cas <= T; cas++) {
int n, now = 0;
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d%d", &a[i], &b[i]);
v[++now] = a[i], v[++now] = b[i];
}
sort(v + 1, v + 1 + now);
int len = unique(v + 1, v + 1 + now) - v - 1;
for (int i = 1; i <= len; i++) f[i] = i, val[i] = 1, cnt[i] = 0;
for (int i = 1; i <= n; i++) {
a[i] = lower_bound(v + 1, v + 1 + len, a[i]) - v;
b[i] = lower_bound(v + 1, v + 1 + len, b[i]) - v;
if (same(a[i], b[i])) val[find(a[i])]++;
else unite(a[i], b[i]);
}
int ans = 0;
for (int i = 1; i <= len; i++) cnt[find(i)]++;
for (int i = 1; i <= len; i++) {
if (!cnt[i]) continue;
if (val[i] > cnt[i]) ans += cnt[i];
else ans += cnt[i] - 1;
}
printf("Case #%d: %d\n", cas, ans);
}
return 0;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥
2019-08-05 Codeforces Round #577 (Div. 2) D. Treasure Hunting