Submission #806744

# Submission time Handle Problem Language Result Execution time Memory
806744 2023-08-04T09:28:41 Z ashcomp LOSTIKS (INOI20_lostiks) C++14
23 / 100
2000 ms 368792 KB
#include <bits/stdc++.h>
 
using namespace std;
 
#define all(x) x.begin() , x.end()
#define pii pair<int,int>
#define pll pair<ll,ll>
#define F first
#define S second
#define wall cerr<<"------------------------"<<endl
 
typedef long long ll;
 
const ll INF = 1e9;
const ll maxn = 2e6 + 10;
const ll mod = 1e9 + 7;
 
int n , m , k , ST , EN;
int h[maxn] , p[maxn] , st[maxn] , en[maxn];
int a[maxn<<1] , rmq[maxn<<1][22] , ps_rmq[maxn<<1][22] , rrmq[maxn<<1][22] , ps_rrmq[maxn<<1][22] , len[maxn<<1];
vector<int> g[maxn] , LSA;
bool mrk[maxn];
void DFS(int v)
{
        mrk[v] = 1;
        LSA.push_back(v);
        st[v] = LSA.size()-1;
        for(auto u : g[v]){
 
                if(mrk[u]==1)continue;
                p[u] = v;
                h[u] = h[v]+1;
                DFS(u);
                LSA.push_back(v);
        }
        en[v] = LSA.size()-1;
        
}
inline void pre_LCA()
{
        LSA.push_back(0);
        p[ST] = -1;
        h[ST] = 1;
        DFS(ST);
        m = LSA.size()-1;
        //wall;
        for(int i=1; i<=m; i++){
                a[i] = h[LSA[i]];
        }
        for(int j=0; j<=21; j++){
                for(int i=1; i<=m; i++){
                        if(j==0){
                                rmq[i][j] = a[i];
                                rrmq[i][j] = a[i];
                                ps_rmq[i][j] = i;
                                ps_rrmq[i][j] = i;
                                continue;
                        }
                        if((i+(1<<j)-1)<=m){
                                rmq[i][j] = rmq[i][j-1];
                                ps_rmq[i][j] = ps_rmq[i][j-1];
                                if(rmq[i][j-1] > rmq[i+(1<<(j-1))][j-1]){
                                        rmq[i][j] = rmq[i+(1<<(j-1))][j-1];
                                        ps_rmq[i][j] = ps_rmq[i+(1<<(j-1))][j-1];
                                }
                        }
                        if((i-(1<<j)+1)>0){
                                rrmq[i][j] = rrmq[i][j-1];
                                ps_rrmq[i][j] = ps_rrmq[i][j-1];
                                if(rrmq[i][j-1] > rrmq[i-(1<<(j-1))][j-1]){
                                        rrmq[i][j] = rrmq[i-(1<<(j-1))][j-1];
                                        ps_rrmq[i][j] = ps_rrmq[i-(1<<(j-1))][j-1];
                                }
                        }
                }
        }
        int PS = 0;
        for(int i=1; i<=m; i++){
                if(((1<<PS)<<1)<=i){
                        PS++;
                }
                len[i] = PS;
        }
}//OK
inline int LCA(int v , int u)
{
        int l = min(st[v],st[u]) , r=max(st[v],st[u]);
        int ln = len[r-l+1];
        int x = rmq[l][ln] , y = rrmq[r][ln];
        if(x < y){
                int pos = ps_rmq[l][ln];
                return LSA[pos];
        }else{
                int pos = ps_rrmq[r][ln];
                return LSA[pos];
        }
}
inline int DIS(int v , int u)
{
        return (h[v]+h[u]-h[LCA(v,u)]-h[LCA(v,u)]);
}
 
vector<pii> eg[maxn];
bool mark[maxn];
int req[maxn];
map<int,int> MP[maxn]; 
void dfs(int v)
{
        mark[v] = 1;
        for(auto e : eg[v]){
                int u=e.F , w=e.S;
                if(mark[u]==1)continue;
                p[u] = v;
                req[u] = req[v];
                if(w!=0){
                        int x = MP[v][u];
                        req[u] |= (1<<x);
                }
                dfs(u);
        }
}
 
vector<pair<int,pii>> EG;
int dp[1<<22][22];
 
int main()
{
        ios_base::sync_with_stdio(0);cin.tie(NULL);cout.tie(NULL);
        cin>>n>>ST>>EN;
        int ps = 0;
        for(int i=1; i<n; i++){
                int v,u,w; cin>>v>>u>>w;
                if(w!=0){
                        MP[v][u] = ps;
                        MP[u][v] = ps;
                        ps++;
                        EG.push_back({w,{v,u}});
                }
                eg[v].push_back({u,w});
                eg[u].push_back({v,w});
                g[v].push_back(u);
                g[u].push_back(v);
        }
        /**/
        pre_LCA();
        for(int i=1; i<=n; i++){
                p[i] = -1;
        }
        dfs(ST);
        for(int i=1; i<(1<<((int)EG.size()))+(1<<((int)EG.size())); i++){
                for(int j=0; j<((int)EG.size())+1; j++){
                        dp[i][j] = INF;
                }
        }
        for(ll i=1; i<(1<<((int)EG.size())); i++){
                int pos = i;
                while(pos>0){
                        int j = __builtin_ctz(pos);
                        pos -= (1<<j);
                        int x = i^(1<<j);
                        int V=EG[j].S.F , U=EG[j].S.S , W=EG[j].F;
                        if(req[W]!=(req[W]&x))continue;
                        if(req[V]!=(req[V]&x) && req[U]!=(req[U]&x))continue;
                        if(x==0){
                                dp[i][j] = DIS(ST,W) + min(DIS(W,V),DIS(W,U));
                                continue;
                        }
                        int POS=i;
                        while(POS>0){
                                int f = __builtin_ctz(POS);
                                POS -= 1<<f;
                                int v=EG[f].S.F , u=EG[f].S.S;
                                int D1=DIS(ST,v) , D2=DIS(ST,u);
                                if(D1>D2){
                                        swap(v,u);
                                }
                                dp[i][j] = min(dp[i][j] , dp[x][f]+DIS(v,W)+min(DIS(W,V),DIS(W,U)) );
                        }
                }
        }
        /***********************************/
        ps = ((int)EG.size());
        eg[EN].push_back({n+1,EN});
        eg[n+1].push_back({EN,EN});
        MP[EN][n+1] = ps;
        MP[EN][n+1] = ps;
        EG.push_back({EN,{EN,n+1}});
 
        for(ll i=(1<<ps); i<(1<<(ps+1)); i++){
                int j = ps;
                int x = i^(1<<j);
                int V=EG[j].S.F , U=EG[j].S.S , W=EG[j].F;
                if(req[W]!=(req[W]&x))continue;
                if(req[V]!=(req[V]&x) && req[U]!=(req[U]&x))continue;
                if(x==0){
                        dp[i][j] = DIS(ST,W) + min(DIS(W,V),DIS(W,U));
                        continue;
                }
                int POS=i;
                while(POS>0){
                        int f = __builtin_ctz(POS);
                        POS -= 1<<f;
                        int v=EG[f].S.F , u=EG[f].S.S;
                        int D1=DIS(ST,v) , D2=DIS(ST,u);
                        if(D1>D2){
                                swap(v,u);
                        }
                        dp[i][j] = min(dp[i][j] , dp[x][f]+DIS(v,W)+min(DIS(W,V),DIS(W,U)) );
                }
        }
        int ans = INF;
        for(int i=(1<<ps); i<(1<<(ps+1)); i++){
                ans = min(ans , dp[i][ps]);
        }
        /*ll ans = INF;
        for(int i=1; i<(1<<((int)EG.size())); i++)
        {
                for(int j=0; j<((int)EG.size()); j++){
                        int V=EG[j].S.F , U=EG[j].S.S;
                        if(DIS(V,ST)>DIS(U,ST)){
                                swap(V,U);
                        }
                        if(req[EN]!=(req[EN]&i))continue;
                        ans = min(ans , (ll)dp[i][j] + DIS(V,EN));
                }
        }*/
        if(ans==INF){
                cout<<-1;
                return 0;
        }
        cout<<ans;
        return 0;
}
/*
3
1 3
1 2 3
1 3 2
*/
/*
10
1 10
1 2 0
2 3 0
3 4 0
4 5 2
2 6 4
2 7 0
7 8 5
8 9 6
9 10 0
ans = 19
*/
/**
4
1 4
1 2 0
1 3 2
3 4 1
ans = 4;
*/
/*
5
3 1
1 2 5
2 3 4
3 4 0
4 5 2
ans = 10;
*/
# Verdict Execution time Memory Grader output
1 Correct 76 ms 188252 KB Output is correct
2 Correct 76 ms 188172 KB Output is correct
3 Correct 214 ms 269048 KB Output is correct
4 Correct 236 ms 268984 KB Output is correct
5 Correct 214 ms 269068 KB Output is correct
6 Correct 212 ms 269040 KB Output is correct
7 Correct 231 ms 269148 KB Output is correct
8 Correct 242 ms 269116 KB Output is correct
9 Correct 224 ms 269392 KB Output is correct
10 Correct 221 ms 269200 KB Output is correct
11 Correct 216 ms 269160 KB Output is correct
12 Correct 212 ms 271680 KB Output is correct
13 Correct 212 ms 270972 KB Output is correct
14 Correct 235 ms 270312 KB Output is correct
15 Correct 219 ms 271904 KB Output is correct
16 Correct 222 ms 273036 KB Output is correct
17 Correct 210 ms 273060 KB Output is correct
18 Correct 203 ms 273932 KB Output is correct
19 Correct 209 ms 280292 KB Output is correct
20 Correct 216 ms 280084 KB Output is correct
21 Correct 213 ms 279684 KB Output is correct
22 Correct 86 ms 188456 KB Output is correct
23 Correct 77 ms 188340 KB Output is correct
24 Correct 78 ms 188420 KB Output is correct
25 Correct 77 ms 188488 KB Output is correct
26 Correct 76 ms 188392 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 86 ms 188256 KB Output is correct
2 Correct 75 ms 188228 KB Output is correct
3 Correct 76 ms 188572 KB Output is correct
4 Correct 81 ms 188632 KB Output is correct
5 Correct 570 ms 284268 KB Output is correct
6 Correct 470 ms 284272 KB Output is correct
7 Correct 697 ms 284268 KB Output is correct
8 Correct 466 ms 284272 KB Output is correct
9 Correct 553 ms 284284 KB Output is correct
10 Correct 272 ms 284300 KB Output is correct
11 Correct 270 ms 284312 KB Output is correct
12 Correct 272 ms 284300 KB Output is correct
13 Correct 273 ms 284300 KB Output is correct
14 Correct 295 ms 284308 KB Output is correct
15 Correct 515 ms 284296 KB Output is correct
16 Correct 702 ms 284324 KB Output is correct
17 Correct 583 ms 284292 KB Output is correct
18 Correct 287 ms 284544 KB Output is correct
19 Correct 278 ms 284660 KB Output is correct
20 Correct 281 ms 284428 KB Output is correct
21 Correct 264 ms 284540 KB Output is correct
22 Correct 335 ms 285080 KB Output is correct
23 Correct 289 ms 285096 KB Output is correct
24 Correct 309 ms 285092 KB Output is correct
25 Execution timed out 2111 ms 368792 KB Time limit exceeded
26 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 76 ms 188252 KB Output is correct
2 Correct 76 ms 188172 KB Output is correct
3 Correct 214 ms 269048 KB Output is correct
4 Correct 236 ms 268984 KB Output is correct
5 Correct 214 ms 269068 KB Output is correct
6 Correct 212 ms 269040 KB Output is correct
7 Correct 231 ms 269148 KB Output is correct
8 Correct 242 ms 269116 KB Output is correct
9 Correct 224 ms 269392 KB Output is correct
10 Correct 221 ms 269200 KB Output is correct
11 Correct 216 ms 269160 KB Output is correct
12 Correct 212 ms 271680 KB Output is correct
13 Correct 212 ms 270972 KB Output is correct
14 Correct 235 ms 270312 KB Output is correct
15 Correct 219 ms 271904 KB Output is correct
16 Correct 222 ms 273036 KB Output is correct
17 Correct 210 ms 273060 KB Output is correct
18 Correct 203 ms 273932 KB Output is correct
19 Correct 209 ms 280292 KB Output is correct
20 Correct 216 ms 280084 KB Output is correct
21 Correct 213 ms 279684 KB Output is correct
22 Correct 86 ms 188456 KB Output is correct
23 Correct 77 ms 188340 KB Output is correct
24 Correct 78 ms 188420 KB Output is correct
25 Correct 77 ms 188488 KB Output is correct
26 Correct 76 ms 188392 KB Output is correct
27 Correct 86 ms 188256 KB Output is correct
28 Correct 75 ms 188228 KB Output is correct
29 Correct 76 ms 188572 KB Output is correct
30 Correct 81 ms 188632 KB Output is correct
31 Correct 570 ms 284268 KB Output is correct
32 Correct 470 ms 284272 KB Output is correct
33 Correct 697 ms 284268 KB Output is correct
34 Correct 466 ms 284272 KB Output is correct
35 Correct 553 ms 284284 KB Output is correct
36 Correct 272 ms 284300 KB Output is correct
37 Correct 270 ms 284312 KB Output is correct
38 Correct 272 ms 284300 KB Output is correct
39 Correct 273 ms 284300 KB Output is correct
40 Correct 295 ms 284308 KB Output is correct
41 Correct 515 ms 284296 KB Output is correct
42 Correct 702 ms 284324 KB Output is correct
43 Correct 583 ms 284292 KB Output is correct
44 Correct 287 ms 284544 KB Output is correct
45 Correct 278 ms 284660 KB Output is correct
46 Correct 281 ms 284428 KB Output is correct
47 Correct 264 ms 284540 KB Output is correct
48 Correct 335 ms 285080 KB Output is correct
49 Correct 289 ms 285096 KB Output is correct
50 Correct 309 ms 285092 KB Output is correct
51 Execution timed out 2111 ms 368792 KB Time limit exceeded
52 Halted 0 ms 0 KB -