QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#373160#5102. Dungeon CrawlerRobeZH#WA 219ms4836kbC++233.9kb2024-04-01 04:41:592024-04-01 04:41:59

Judging History

你现在查看的是最新测评结果

  • [2024-04-01 04:41:59]
  • 评测
  • 测评结果:WA
  • 用时:219ms
  • 内存:4836kb
  • [2024-04-01 04:41:59]
  • 提交

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'