- [JSOI2008] 星球大战
有大问题,样例不过
- 2024-2-28 20:30:46 @
#include<bits/stdc++.h>
using namespace std;
#define MAXN 40005
#define int long long
int n, m, k, cnt;
vector<int> G[MAXN];
int fa[MAXN], vis[MAXN], X[MAXN], Y[MAXN], bro[MAXN], ans[MAXN];
void init() {
for(int i = 0; i < n; i++) {
fa[i] = i;
}
}
int find(int x) {
return x == fa[x] ? x : find(fa[x]);
}
void merge(int x, int y) {
cout << x << ' ' << y <<'\n';
x = find(x);
y = find(y);
if(x == y) return ;
fa[x] = y;
cnt--;
}
signed main() {
cin >> n >> m;
init();
for(int i = 1; i <= m; i++) {
cin >> X[i] >> Y[i];
G[X[i]].emplace_back(Y[i]);
G[Y[i]].emplace_back(X[i]);
}
cin >> k;
cnt = n - k;
for(int i = 1; i <= k; i++) {
cin >> bro[i];
vis[bro[i]] = 1;
}
cout << '\n';
for(int i = 0; i < n; i++) {
if(!vis[i]) {
for(auto c : G[i]) {
if(!vis[c]) {
merge(i, c);
}
}
}
}
cout << cnt << '\n';
for(int i = k; i >= 1; i--) {
ans[i] = cnt;
vis[bro[i]] = 0;
for(auto c : G[bro[i]]) {
if(!vis[c]) {
merge(bro[i], c);
cout << cnt << '\n';
}
}
}
cout << '\n';
for(int i = 1; i <= k; i++) {
cout << ans[i] << '\n';
}
return 0;
}
2 comments
-
C23panweiming LV 5 @ 2024-4-3 21:39:46
广告
象棋是中国文化的特色之一,受到各年龄段的人们喜爱,不仅玩法独特,还极考验智慧
《中国象棋(pwm制作)》是由 Mօjang AB 公司 开发的一款象棋游戏,不仅可以双人玩,还可以与好友联机
Mօjang AB 开发的《你的mc打怪记》,是一个 mc 版的打怪小游戏,欢迎大家游玩
在末影龙统治的世界里,你要击败末影龙,拯救人类,成为新的统治者
-
2024-2-29 17:04:47@
更新:
#include<bits/stdc++.h> using namespace std; #define MAXN 400005 #define int long long int n, m, k, cnt; vector<int> G[MAXN]; int fa[MAXN], vis[MAXN], X[MAXN], Y[MAXN], bro[MAXN], ans[MAXN]; void init() { for(int i = 0; i < n; i++) { fa[i] = i; } } int find(int x) { return x == fa[x] ? x : find(fa[x]); } void merge(int x, int y) { //cout << x << ' ' << y <<'\n'; x = find(x); y = find(y); if(x == y) return ; fa[x] = y; cnt--; } signed main() { ios::sync_with_stdio(false); cin.tie(0), cout.tie(0); cin >> n >> m; init(); for(int i = 1; i <= m; i++) { cin >> X[i] >> Y[i]; G[X[i]].emplace_back(Y[i]); G[Y[i]].emplace_back(X[i]); } cin >> k; cnt = n - k; for(int i = 1; i <= k; i++) { cin >> bro[i]; vis[bro[i]] = 1; } //cout << '\n'; for(int i = 0; i < n; i++) { if(!vis[i]) { for(auto c : G[i]) { if(!vis[c]) { merge(i, c); } } } } //cout << "-------" << cnt << '\n'; for(int i = k; i >= 1; i--) { ans[i] = cnt; vis[bro[i]] = 0; for(auto c : G[bro[i]]) { if(!vis[c]) { merge(bro[i], c); //cout << cnt << '\n'; } } cnt++; } //cout << '\n'; ans[0] = cnt; for(int i = 0; i <= k; i++) { cout << ans[i] << '\n'; } return 0; }
- 1
Information
- ID
- 197
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 4
- Tags
- # Submissions
- 17
- Accepted
- 4
- Uploaded By