| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
|---|---|---|---|---|---|---|---|
| 1333705 | justin271828 | Laser Strike (EGOI25_laserstrike) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
using namespace std;
#define ii pair<int, int>
#define f first
#define s second
int main() {
int P, N;
cin >> P >> N;
if (P == 1) {
int ans = 0;
vector<int> v[N];
for (int i = 1; i < N; i++) {
int a, b;
cin >> a >> b;
v[a].push_back(b);
v[b].push_back(a);
}
int root = -1;
for (int i = 0; i < N; i++) {
if (v[i].size() >= 3) root = i;
}
if (root == -1) {
}
vector<ii> small;
vector<ii> large;
set<int> seta;
for (int i = 0; i < N; i++) {
if (v[i].size() != 1) continue;
if (v[i][0] != root) seta.insert(v[i][0]);
if (v[i][0] > i) small.push_back({i, v[i][0]});
else large.push_back({v[i][0], i});
}
sort(small.begin(), small.end());
sort(large.begin(), large.end());
if (small[small.size()-1] < large[0]) ans = 1;
cout << ans << "\n";
if (ans == 1) {
for (ii p: large) cout << p.f << "\n";
for (ii p: small) cout << p.s << "\n";
}
else {
for (ii p: small) cout << p.s << "\n";
for (ii p: large) cout << p.f << "\n";
}
for (set<int>::iterator it = seta.begin(); it != seta.end(); it++) {
int x = *it;
while (true) {
if (x == root) break;
v[x].clear();
cout << x << "\n";
if (v[v[x][0]].size() <= 1) x = v[x][1];
else x = v[x][0];
}
}
}
else {
int str;
cin >> str;
ii p = {-6, -7};
bool B = (str == 0);
set<int> seta;
int count = N;
while (count > 0) {
int a, b;
cin >> a >> b;
//if (seta.find(a) != seta.end()) break;
//if (seta.find(b) != seta.end()) break;
if ({a, b} < p) B = !B;
p = {a, b};
if (B) {
cout << min(a, b) << "\n";
seta.insert(max(a, b));}
else {
cout << max(a, b) << "\n";
seta.insert(min(a, b));}
count--;
}
}
return 0;
}