Skip to content

Commit 3dcb64e

Browse files
committed
QOJ: The 2025 ICPC Asia Shanghai Regional Contest (Upsolving)
1 parent 7e81c10 commit 3dcb64e

2 files changed

Lines changed: 167 additions & 0 deletions

File tree

QOJ/15314.cpp

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
/**
2+
* @file 15314.cpp
3+
* @author Macesuted (i@macesuted.moe)
4+
* @date 2025-12-09
5+
*
6+
* @copyright Copyright (c) 2025
7+
*
8+
*/
9+
10+
#include <bits/stdc++.h>
11+
using namespace std;
12+
13+
#define maxn 30005
14+
15+
vector<vector<int>> graph;
16+
int dfni[maxn], dfno[maxn], fa[maxn], dep[maxn], sum[maxn];
17+
18+
bool query(int p, int d) {
19+
cout << "? " << p << ' ' << d << endl;
20+
int ret;
21+
cin >> ret;
22+
return ret;
23+
}
24+
25+
int dfnt;
26+
void dfs1(int p) {
27+
dfni[p] = ++dfnt;
28+
for (auto q : graph[p]) dep[q] = dep[p] + 1, dfs1(q);
29+
dfno[p] = dfnt;
30+
return;
31+
}
32+
33+
void solve(void) {
34+
int n;
35+
cin >> n;
36+
graph.clear(), graph.resize(n + 1);
37+
38+
for (int i = 2; i <= n; i++) cin >> fa[i], graph[fa[i]].push_back(i);
39+
dfs1(1);
40+
41+
int l = 0, r = 0;
42+
for (int i = 1; i <= n; i++) r = max(r, dep[i]);
43+
while (l < r) {
44+
int mid = (l + r) >> 1;
45+
query(1, mid) ? (r = mid) : (l = mid + 1);
46+
}
47+
48+
vector<int> rec;
49+
for (int i = 1; i <= n; i++)
50+
if (dep[i] == l) rec.push_back(i);
51+
52+
while (rec.size() > 1) {
53+
for (int i = 1; i <= n; i++) sum[i] = 0;
54+
for (auto p : rec) sum[p] = 1;
55+
for (int i = n; i >= 1; i--)
56+
for (auto j : graph[i]) sum[i] += sum[j];
57+
58+
int xp = -1, v = 0;
59+
for (int i = 2; i <= n; i++)
60+
if (v < min(sum[i], sum[1] - sum[i])) v = min(sum[i], sum[1] - sum[i]), xp = i;
61+
62+
vector<int> rd, ru;
63+
for (auto p : rec)
64+
if (dfni[xp] <= dfni[p] && dfni[p] <= dfno[xp])
65+
rd.push_back(p);
66+
else
67+
ru.push_back(p);
68+
69+
int x = rd.front();
70+
int ret = query(x, 2 * (dep[x] - dep[xp]));
71+
rec = ret ? rd : ru;
72+
}
73+
74+
cout << "! " << rec.front() << endl;
75+
76+
return;
77+
}
78+
79+
int main() {
80+
ios::sync_with_stdio(false), cin.tie(nullptr);
81+
82+
int _ = 1;
83+
cin >> _;
84+
while (_--) solve();
85+
86+
return 0;
87+
}

QOJ/15315.cpp

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
/**
2+
* @file 15315.cpp
3+
* @author Macesuted (i@macesuted.moe)
4+
* @date 2025-12-09
5+
*
6+
* @copyright Copyright (c) 2025
7+
*
8+
*/
9+
10+
#include <bits/stdc++.h>
11+
using namespace std;
12+
13+
#define endl '\n'
14+
15+
#define maxn 200005
16+
17+
vector<vector<int>> graph;
18+
int a[maxn], dep[maxn], fa[maxn];
19+
bool vis[maxn];
20+
21+
vector<int> ans;
22+
int sum;
23+
void dfs(int p) {
24+
ans.push_back(p), a[p] ^= 1;
25+
vis[p] = true;
26+
for (auto q : graph[p]) {
27+
if (vis[q]) {
28+
if (sum && dep[q] <= dep[p] && !((dep[p] - dep[q]) & 1)) {
29+
sum = 0;
30+
int x = p;
31+
while (x != q) ans.push_back(x = fa[x]), a[x] ^= 1;
32+
ans.push_back(p), a[p] ^= 1;
33+
}
34+
continue;
35+
}
36+
dep[q] = dep[p] + 1, fa[q] = p, dfs(q);
37+
ans.push_back(p), a[p] ^= 1;
38+
if (a[q]) {
39+
ans.push_back(q), a[q] ^= 1;
40+
ans.push_back(p), a[p] ^= 1;
41+
}
42+
}
43+
return;
44+
}
45+
46+
void solve(void) {
47+
int n, m, r;
48+
cin >> n >> m >> r;
49+
50+
for (int i = 1; i <= n; i++) cin >> a[i], a[i] &= 1;
51+
52+
graph.clear(), graph.resize(n + 1);
53+
for (int i = 1, x, y; i <= m; i++) cin >> x >> y, graph[x].push_back(y), graph[y].push_back(x);
54+
55+
ans.clear(), sum = 0;
56+
for (int i = 1; i <= n; i++) sum ^= a[i], vis[i] = false;
57+
a[r] ^= 1, dep[r] = 0, dfs(r);
58+
59+
for (int i = 1; i <= n; i++)
60+
if (a[i]) return cout << "No" << endl, void();
61+
62+
ans.pop_back();
63+
reverse(ans.begin(), ans.end());
64+
65+
cout << "Yes" << endl << ans.size() << endl;
66+
for (auto x : ans) cout << x << ' ';
67+
cout << endl;
68+
69+
return;
70+
}
71+
72+
int main() {
73+
ios::sync_with_stdio(false), cin.tie(nullptr);
74+
75+
int _ = 1;
76+
cin >> _;
77+
while (_--) solve();
78+
79+
return 0;
80+
}

0 commit comments

Comments
 (0)