//BITARO BITARO BITARO
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int K = 20;
struct tree {
int n, root, tt = 0;
vector<ll> dist;
vector<vector<pair<int, ll>>> adj;
vector<vector<int>> jump, g;
vector<bool> vis;
vector<int> time_in, depth;
tree(int _n, int _root) {
n = _n, root = _root;
adj.resize(n);
g.resize(n);
}
void init() {
dist.assign(n, 0);
depth.assign(n, 0);
vis.assign(n, false);
jump.assign(n, vector<int>(K, root));
time_in.assign(n, 0);
dfs(root, -1);
for(int j = 1; j < K; ++j) {
for(int i = 0; i < n; ++i) {
jump[i][j] = jump[jump[i][j - 1]][j - 1];
}
}
}
void add_edge(int a, int b) {
if(a >= n || b >= n) exit(0);
g[a].push_back(b);
}
void add_edge(int a, int b, ll w) {
if(a >= n || b >= n) exit(0);
adj[a].push_back({b, w});
}
void dfs(int u, int par) {
time_in[u] = tt++;
for(int v: g[u]) {
if(v == par) continue;
depth[v] = depth[u] + 1;
dfs(v, u);
}
}
void get_distances(int u) {
vis[u] = true;
for(auto x: adj[u]) {
int v = x.first;
ll w = x.second;
if(vis[v]) continue;
dist[v] = dist[u] + w;
get_distances(v);
}
}
int lca(int a, int b) {
if(depth[a] < depth[b]) swap(a, b);
for(int j = K - 1; j >= 0; --j) {
if(depth[jump[a][j]] >= depth[b]) a = jump[a][j];
}
if(a == b) return a;
for(int j = K - 1; j >= 0; --j) {
if(jump[a][j] != jump[b][j]) a = jump[a][j], b = jump[b][j];
}
return jump[a][0];
}
int get_depth(int u) {return dist[u];}
int tm(int x) {return time_in[x];}
};
int time1[(int)1e6 + 5], time2[(int)1e6 + 5];
bool cmp1(int x, int y) {
return time1[x] < time1[y];
}
bool cmp2(int x, int y) {
return time2[x] < time2[y];
}
int main() {
int n, k, q, t; cin >> n >> k >> q >> t;
vector<int> p1(n), p2(n);
int root1 = -1, root2 = -1;
for(int i = 0; i < n; ++i) {
cin >> p1[i]; --p1[i];
if(p1[i] == -2) root1 = i;
}
for(int i = 0; i < n; ++i) {
cin >> p2[i]; --p2[i];
if(p2[i] == -2) root2 = i;
}
if(root1 == -1 || root2 == -1) exit(0);
tree t1(n, root1), t2(n, root2);
for(int i = 0; i < n; ++i) {
if(p1[i] != -2) t1.add_edge(p1[i], i);
if(p2[i] != -2) t2.add_edge(p2[i], i);
}
t1.init(); t2.init();
vector<int> nodes(n); iota(nodes.begin(), nodes.end(), 0);
for(int i = 0; i < n; ++i) {
//time1[i] = t1.tm(i);
//time2[i] = t2.tm(i);
}
sort(nodes.begin(), nodes.end(), cmp1);
while((int)nodes.size() > k) nodes.pop_back();
if(nodes[0] != root1) exit(0);
if(t1.tm(root2) >= k) {
nodes.pop_back();
nodes.push_back(root2);
}
if(nodes.size() != k) exit(0);
for(int x: nodes) cout << x + 1 << " ";
cout << "\n"; cout.flush();
sort(nodes.begin(), nodes.end(), cmp2);
for(int i = 0; i < k - 1; ++i) {
cout << "? " << nodes[i] + 1 << " " << nodes[i + 1] + 1 << "\n";
}
cout << "!\n"; cout.flush();
for(int i = 0; i < k - 1; ++i) {
{
int u = nodes[i], v = nodes[i + 1];
int l = t1.lca(u, v);
int c1, c2; cin >> c1 >> c2;
t1.add_edge(l, u, c1);
t1.add_edge(l, v, c2);
t1.add_edge(u, l, -c1);
t1.add_edge(v, l, -c2);
}
{
int u = nodes[i], v = nodes[i + 1];
int l = t2.lca(u, v);
int c1, c2; cin >> c1 >> c2;
t2.add_edge(l, u, c1);
t2.add_edge(l, v, c2);
t2.add_edge(u, l, -c1);
t2.add_edge(v, l, -c2);
}
}
t1.get_distances(root1);
t2.get_distances(root2);
vector<pair<int, int>> queries(t);
for(int i = 0; i < t; ++i) {
cin >> queries[i].first >> queries[i].second; --queries[i].first, --queries[i].second;
}
for(auto x: queries) {
{
int l = t1.lca(x.first, x.second);
cout << t1.get_depth(x.first) + t1.get_depth(x.second) - 2 * t1.get_depth(l) << " ";
}
{
int l = t2.lca(x.first, x.second);
cout << t2.get_depth(x.first) + t2.get_depth(x.second) - 2 * t2.get_depth(l) << "\n";
}
}
cout.flush();
}
Compilation message
Main.cpp: In function 'int main()':
Main.cpp:112:21: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
112 | if(nodes.size() != k) exit(0);
| ~~~~~~~~~~~~~^~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
1134 ms |
233396 KB |
Unexpected end of file - int32 expected |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
967 ms |
233236 KB |
Unexpected end of file - int32 expected |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
936 ms |
233336 KB |
Unexpected end of file - int32 expected |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
1894 ms |
466244 KB |
Unexpected end of file - int32 expected |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
1864 ms |
466420 KB |
Unexpected end of file - int32 expected |
2 |
Halted |
0 ms |
0 KB |
- |