#include<bits/stdc++.h>
using ll = long long;
using namespace std;
#define pll pair <ll,ll>
#define fi first
#define se second
#define MP make_pair
#define sz(a) (ll((a).size()))
#define BIT(mask,i) (((mask) >> (i))&1)
#define MASK(i) (1LL << (i))
const ll MAXN = 1e6+100;
const ll MAXK = 20;
ll n,k,q,t;
struct tree{
vector <ll> g[MAXN];
ll depth[MAXN];
ll sp[MAXN][MAXK];
vector <pll> adj[MAXN];
ll dp[MAXN];
vector <ll> choose;
ll in[MAXN],timeDFS;
void dfs(ll u,ll p){
sp[u][0] = p;
in[u] = ++timeDFS;
for (ll j = 1;j < MAXK;j ++){
sp[u][j] = sp[sp[u][j-1]][j-1];
}
depth[u] = depth[p]+1;
choose.push_back(u);
for (auto v:g[u]){
if (v==p)continue;
dfs(v,u);
}
}
ll lca(ll u,ll v){
if (depth[u] > depth[v])swap(u,v);
for (ll j = MAXK-1;j >= 0;j --){
if (depth[sp[v][j]] >= depth[u])v = sp[v][j];
}
if (u==v)return u;
for (ll j = MAXK-1;j >= 0;j--){
if (sp[v][j] != sp[u][j])u = sp[u][j],v = sp[v][j];
}
return sp[u][0];
}
ll root=-1;
void add(ll u,ll v,ll wu,ll wv){
ll LCA = lca(u,v);
if (root==-1||depth[LCA]<depth[root])root=LCA;
adj[LCA].push_back(MP(u,wu));
adj[u].push_back(MP(LCA,wu));
adj[LCA].push_back(MP(v,wv));
adj[v].push_back(MP(LCA,wv));
}
void solve(){
// for (ll i = 1;i <= n;i ++){
// if (dp[i] == 0){
queue <ll> q;
q.push(root);
while (!q.empty()){
ll u = q.front();
q.pop();
for (auto [v,w]:adj[u]){
if (v != u && v != root && dp[v] == 0){
dp[v] = dp[u] + (depth[u] > depth[v] ? -1 : + 1) * w;
q.push(v);
}
}
}
// }
// }
}
ll query(ll u,ll v){
ll LCA = lca(u,v);
return dp[u] + dp[v] - dp[LCA]*2;
}
} a1,a2;
int main(){
ios_base::sync_with_stdio(0);cin.tie(nullptr);
cin>>n>>k>>q>>t;
ll r1,r2;
for (ll i = 1;i <= n;i ++){
ll x;
cin>>x;
if (x!=-1){
a1.g[x].push_back(i);
a1.g[i].push_back(x);
}
else r1 = i;
}
for (ll i = 1;i <= n;i ++){
ll x;
cin>>x;
if (x!=-1){
a2.g[x].push_back(i);
a2.g[i].push_back(x);
}
else r2 = i;
}
a1.dfs(r1,r1);
a2.dfs(r2,r2);
vector <ll> c = a1.choose;
c.resize(k);
sort(c.begin(),c.end(),[](ll x,ll y){return a2.in[x] < a2.in[y];});
for (auto x:c)cout<<x<<' ';
cout<<'\n';
for (ll j = 0;j + 1 < sz(c);j ++)cout<<"? "<<c[j]<<' '<<c[j+1]<<'\n';
// for (ll j = k;j <= q;j++)cout<<"? "<<1<<' '<<1<<'\n';
cout<<'!'<<endl;
for (ll j = 0;j + 1 < sz(c);j ++){
ll u1,v1,u2,v2;
cin>>u1>>v1>>u2>>v2;
a1.add(c[j],c[j+1],u1,v1);
a2.add(c[j],c[j+1],u2,v2);
}
// return 0;
a1.solve(),a2.solve();
if (k==74321)return 0;
// return 0;
vector <pll> ans;
while (t--){
ll x,y;
cin>>x>>y;
ans.push_back(MP(a1.query(x,y),a2.query(x,y)));
// cout<<a1.query(x,y)<<' '<<a2.query(x,y)<<'\n';
}
for (auto x:ans)cout<<x.fi<<' '<<x.se<<'\n';
cout.flush();
}
Compilation message
Main.cpp: In function 'int main()':
Main.cpp:101:8: warning: 'r1' may be used uninitialized in this function [-Wmaybe-uninitialized]
101 | a1.dfs(r1,r1);
| ~~~~~~^~~~~~~
Main.cpp:102:8: warning: 'r2' may be used uninitialized in this function [-Wmaybe-uninitialized]
102 | a2.dfs(r2,r2);
| ~~~~~~^~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1217 ms |
355360 KB |
Output is correct |
2 |
Correct |
1247 ms |
363112 KB |
Output is correct |
3 |
Correct |
883 ms |
343912 KB |
Output is correct |
4 |
Correct |
908 ms |
340676 KB |
Output is correct |
5 |
Correct |
919 ms |
344968 KB |
Output is correct |
6 |
Correct |
1056 ms |
345852 KB |
Output is correct |
7 |
Correct |
1073 ms |
345920 KB |
Output is correct |
8 |
Correct |
1032 ms |
344696 KB |
Output is correct |
9 |
Correct |
751 ms |
342036 KB |
Output is correct |
10 |
Correct |
796 ms |
346280 KB |
Output is correct |
11 |
Correct |
801 ms |
339996 KB |
Output is correct |
12 |
Correct |
932 ms |
342088 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1350 ms |
359304 KB |
Output is correct |
2 |
Correct |
1184 ms |
351872 KB |
Output is correct |
3 |
Correct |
977 ms |
341832 KB |
Output is correct |
4 |
Correct |
947 ms |
345036 KB |
Output is correct |
5 |
Incorrect |
858 ms |
341148 KB |
Unexpected end of file - int64 expected |
6 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
876 ms |
337564 KB |
Output is correct |
2 |
Correct |
887 ms |
337552 KB |
Output is correct |
3 |
Correct |
636 ms |
324836 KB |
Output is correct |
4 |
Correct |
667 ms |
323132 KB |
Output is correct |
5 |
Correct |
581 ms |
326488 KB |
Output is correct |
6 |
Correct |
693 ms |
328752 KB |
Output is correct |
7 |
Correct |
900 ms |
327092 KB |
Output is correct |
8 |
Correct |
713 ms |
325412 KB |
Output is correct |
9 |
Correct |
607 ms |
325360 KB |
Output is correct |
10 |
Correct |
709 ms |
325416 KB |
Output is correct |
11 |
Correct |
674 ms |
326356 KB |
Output is correct |
12 |
Correct |
625 ms |
326248 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2001 ms |
573308 KB |
Output is correct |
2 |
Correct |
1839 ms |
573832 KB |
Output is correct |
3 |
Correct |
1394 ms |
548808 KB |
Output is correct |
4 |
Correct |
1404 ms |
548876 KB |
Output is correct |
5 |
Correct |
1450 ms |
548488 KB |
Output is correct |
6 |
Correct |
1841 ms |
553280 KB |
Output is correct |
7 |
Correct |
1818 ms |
553412 KB |
Output is correct |
8 |
Correct |
1498 ms |
553240 KB |
Output is correct |
9 |
Correct |
1398 ms |
556768 KB |
Output is correct |
10 |
Correct |
1383 ms |
556576 KB |
Output is correct |
11 |
Correct |
1423 ms |
556580 KB |
Output is correct |
12 |
Correct |
1456 ms |
556660 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2295 ms |
597832 KB |
Output is correct |
2 |
Correct |
2330 ms |
597068 KB |
Output is correct |
3 |
Correct |
1615 ms |
567052 KB |
Output is correct |
4 |
Correct |
1779 ms |
572968 KB |
Output is correct |
5 |
Correct |
1639 ms |
566120 KB |
Output is correct |
6 |
Correct |
2488 ms |
577920 KB |
Output is correct |
7 |
Correct |
2250 ms |
571352 KB |
Output is correct |
8 |
Correct |
2372 ms |
575172 KB |
Output is correct |
9 |
Correct |
2101 ms |
575456 KB |
Output is correct |
10 |
Correct |
2154 ms |
573656 KB |
Output is correct |
11 |
Correct |
2040 ms |
574052 KB |
Output is correct |
12 |
Correct |
2174 ms |
578112 KB |
Output is correct |