QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#373160 | #5102. Dungeon Crawler | RobeZH# | WA | 219ms | 4836kb | C++23 | 3.9kb | 2024-04-01 04:41:59 | 2024-04-01 04:41:59 |
Judging History
answer
#pragma GCC optimize("O3,unroll-loops")
// #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#include<bits/stdc++.h>
// #include<atcoder/all>
#define FR(i,n) for(int i=0;i<n;++i)
#define eb emplace_back
#define st first
#define nd second
#define x1 fxxkcjb
#define y1 fxxkyzc
#define x2 fxxkzzy
#define y2 fxxknitit
using namespace std;
namespace R=ranges;
template<typename T>
using func=function<T>;
template<typename T>
using vec=vector<T>;
using ll=long long;
using ld=long double;
using i128=__int128;
using pll=pair<ll,ll>;
const int mod=998244353;
void sol(){
int n,q;cin>>n>>q;
vector g(n,vector<pll>());
int total=0;
FR(i,n-1){
int x,y,z;cin>>x>>y>>z;--x,--y;
g[x].eb(y,z),g[y].eb(x,z);
total+=2*z;
}
vector f(11,vector<int>(n,-1));
vector<ll>DIS(n),dep(n);
func<void(int)>build=[&](int x){
for(int i=1;i<11;++i)f[i][x]=f[i-1][x]==-1?-1:f[i-1][f[i-1][x]];
for(auto[y,z]:g[x])if(y!=f[0][x]){
f[0][y]=x;
DIS[y]=DIS[x]+z;
dep[y]=dep[x]+1;
build(y);
}
};
DIS[0]=dep[0]=0;
build(0);
auto lca=[&](int x,int y){
if(dep[x]<dep[y])swap(x,y);
for(int i=10;~i;--i)if(f[i][x]!=-1&&dep[f[i][x]]>=dep[y])x=f[i][x];
if(x==y)return x;
for(int i=10;~i;--i)if(f[i][x]!=f[i][y])x=f[i][x],y=f[i][y];
return f[0][x];
};
auto dis=[&](pll u){
return DIS[u.st]+DIS[u.nd]-2*DIS[lca(u.st,u.nd)];
};
auto upd=[&](pll&u,pll v){
if(dis(u)<dis(v))u=v;
};
auto merge=[&](pll u,pll v){
auto[a,b]=u;
auto[c,d]=v;
pll ret=u;
upd(ret,v);
upd(ret,{a,c});
upd(ret,{a,d});
upd(ret,{b,c});
upd(ret,{b,d});
// too slow?
return ret;
};
vector<pll>ind(n),otd(n);
func<void(int)>dfs=[&](int x){
ind[x]={x,x};
for(auto[y,z]:g[x])if(y!=f[0][x]){
dfs(y);
ind[x]=merge(ind[x],ind[y]);
}
};
dfs(0);
func<void(int)>dfs2=[&](int x){
pll tmp=merge(otd[x],{x,x});
vector<int>c;
for(auto[y,z]:g[x])if(y!=f[0][x])c.eb(y);
vector<pll>tmps(c.size());
FR(i,c.size())tmps[i]=tmp,tmp=merge(tmp,ind[c[i]]);
tmp=merge(otd[x],{x,x});
for(int i=c.size()-1;~i;--i){
otd[c[i]]=merge(tmp,tmps[i]);
dfs2(c[i]);
tmp=merge(tmp,ind[c[i]]);
}
};
auto mxdis=[&](int x,pll u){return max(dis({x,u.st}),dis({x,u.nd}));};
otd[0]={0,0};//not correct but should work
dfs2(0);
FR(tim,q){
int s,k,t;cin>>s>>k>>t;--s,--k,--t;
if(dis({s,k})==dis({s,t})+dis({t,k})){ //trap is on s->k
cout<<"impossible\n";
continue;
}
if(dis({s,t})==dis({s,k})+dis({k,t})){ //key is on s->t
cout<<total-mxdis(s,ind[0])<<"\n";
continue;
}
int trip;
{
trip=lca(s,k);
int tmp=lca(s,t);
if(dep[tmp]>dep[trip])trip=tmp;
tmp=lca(k,t);
if(dep[tmp]>dep[trip])trip=tmp;
}
assert(trip!=k);
pll sside,kside;
if(lca(trip,k)==trip){
//k is inside trip tree
int ptr=k;
for(int i=10;~i;--i)if(f[i][ptr]!=-1&&dep[f[i][ptr]]>dep[trip])ptr=f[i][ptr];
assert(f[0][ptr]==trip);
sside=otd[ptr];
kside=ind[ptr];
}else{
//k is outside trip
sside=ind[trip];
kside=otd[trip];
}
int mx1=mxdis(s,sside),mx2=mxdis(k,kside)-dis({k,trip})+dis({s,trip});
cout<<total-max(mx1,mx2)<<"\n";
}
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
sol();
return 0;
}
/*
5 4
1 2 3
1 3 1
3 4 4
3 5 2
1 2 4
1 4 2
5 2 1
4 3 1
*/
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 3604kb
input:
22 5 1 2 7 2 3 5 3 4 8 3 6 6 3 7 3 2 5 6 5 8 2 8 9 11 2 10 16 1 11 12 11 12 4 11 13 9 1 14 25 14 15 4 15 16 5 15 17 6 15 18 1 15 19 8 14 20 7 20 21 9 20 22 17 1 19 9 1 9 19 1 8 9 1 9 8 2 22 11
output:
316 293 293 impossible 314
result:
ok 5 lines
Test #2:
score: 0
Accepted
time: 1ms
memory: 3920kb
input:
100 100 1 2 289384 2 3 930887 2 4 692778 4 5 636916 4 6 747794 4 7 238336 4 8 885387 8 9 760493 8 10 516650 8 11 641422 8 12 202363 8 13 490028 8 14 368691 8 15 520060 8 16 897764 16 17 513927 16 18 180541 16 19 383427 16 20 89173 16 21 455737 16 22 5212 16 23 595369 16 24 702568 16 25 956430 16 26 ...
output:
103526917 103484292 106288816 104379596 104405611 104775512 105434682 105291604 103838430 105371370 104677980 104175650 105894571 104509242 103971939 105376499 105223283 104153426 105082245 105413188 104130613 104800548 106846555 104138329 103769253 105456754 104044745 104385328 106973740 105460460 ...
result:
ok 100 lines
Test #3:
score: 0
Accepted
time: 1ms
memory: 3644kb
input:
10 6 1 2 4 2 3 7 2 4 8 4 5 6 4 6 4 4 7 6 4 8 7 8 9 3 8 10 10 3 8 1 10 4 7 1 7 3 7 2 9 8 10 3 4 1 6
output:
99 78 97 87 88 93
result:
ok 6 lines
Test #4:
score: 0
Accepted
time: 0ms
memory: 3844kb
input:
10 9 9 2 5 9 1 6 9 4 97 9 7 2 9 8 42 9 10 11 9 6 77 9 3 14 9 5 9 4 7 10 7 3 8 8 7 9 1 4 8 10 7 4 7 1 2 10 1 5 10 7 2 8 4 10
output:
352 427 impossible 443 418 427 418 418 407
result:
ok 9 lines
Test #5:
score: 0
Accepted
time: 1ms
memory: 3660kb
input:
9 9 2 3 48 9 5 31 7 3 97 4 3 16 1 7 24 5 3 82 8 2 51 6 4 33 1 2 8 3 6 8 1 6 3 9 5 6 2 6 4 5 6 1 9 6 4 2 8 9 4 9 2
output:
530 643 impossible 530 impossible 561 impossible 595 627
result:
ok 9 lines
Test #6:
score: 0
Accepted
time: 0ms
memory: 3592kb
input:
8 9 1 7 51 7 6 86 2 3 62 8 4 72 5 6 17 4 1 75 3 1 41 2 3 7 5 8 4 6 1 3 8 6 2 4 2 7 8 5 6 2 1 5 7 1 6 6 7 8
output:
551 impossible 524 558 579 impossible 551 705 524
result:
ok 9 lines
Test #7:
score: 0
Accepted
time: 1ms
memory: 3680kb
input:
9 9 5 4 13 9 2 10 1 9 25 7 6 34 4 2 77 3 8 67 8 1 57 6 9 100 6 4 1 4 1 7 3 2 9 4 9 7 7 9 3 6 2 1 2 8 4 8 6 2 6 5 9
output:
517 545 impossible 530 483 517 642 584 impossible
result:
ok 9 lines
Test #8:
score: 0
Accepted
time: 1ms
memory: 3616kb
input:
10 10 2 4 26 9 8 39 4 5 88 6 3 70 7 6 7 10 4 41 8 3 57 1 6 15 5 6 9 2 8 6 3 9 1 5 7 8 4 7 8 7 6 4 2 7 3 6 8 2 5 4 10 4 8 9 1 5 9
output:
impossible 496 529 441 531 415 566 529 441 523
result:
ok 10 lines
Test #9:
score: 0
Accepted
time: 0ms
memory: 3664kb
input:
10 9 3 2 6 2 1 18 8 1 44 1 9 42 6 3 72 10 8 46 7 10 93 5 3 11 4 10 13 7 3 1 8 2 5 7 5 4 5 10 8 3 1 4 6 4 3 10 1 6 5 10 8 2 10 4
output:
impossible 550 584 impossible 483 impossible 504 impossible 489
result:
ok 9 lines
Test #10:
score: -100
Wrong Answer
time: 219ms
memory: 4836kb
input:
2000 199998 126 244 481188299 718 1159 740107180 1327 1250 248943862 977 1092 780169400 826 27 932696654 1668 638 478193038 229 174 176675890 1251 646 843918836 102 1973 593920932 236 218 165399894 760 151 890198591 232 502 10739184 1961 1409 45917915 548 1840 974742709 1096 630 280975617 1110 1048 ...
output:
819891276 impossible -985116696943 -970776035128 -931811420479 impossible -739441695436 1101022523 -634006837786 -1871258100 impossible impossible -1494978002 impossible impossible impossible -682971615047 -800343338 -897711484276 -808358472744 -753025863061 612078929 impossible -725938348931 imposs...
result:
wrong answer 1st lines differ - expected: '1266421864327', found: '819891276'