답안 #802747

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
802747 2023-08-02T13:59:31 Z ashcomp LOSTIKS (INOI20_lostiks) C++14
0 / 100
241 ms 185052 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 = 1e18;
const ll maxn = 1e6 + 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][21] , ps_rmq[maxn<<1][21] , rrmq[maxn<<1][21] , ps_rrmq[maxn<<1][21] , 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;
        
}
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
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];
        }
}
 
int times=0;
map<int,bool> mp[maxn];
vector<int> ORDER;
vector<pii> eg[maxn];
int dfs(int v , int tm , int end)
{
        //cout<<v<<"=>"<<end<<" : "<<end<<"\n";
        if(times>20){
                return -1;
        }
        if(v==end){
                return 1;
        }
        for(auto e : eg[v]){
                int u=e.F , w=e.S;
                int now = h[end]+h[v]-h[LCA(end,v)]-h[LCA(end,v)];
                int then = h[end]+h[u]-h[LCA(end,u)]-h[LCA(end,u)];
                if(then < now){
                        if(mp[v][u]==0){
                                times++;
                                int tp = dfs(v,times,w);
                                if(tp==-1){
                                        return -1;
                                }
                                ORDER.push_back(w);
                                ORDER.push_back(v);
                                mp[v][u] = 1;
                                mp[u][v] = 1;
                                tp = dfs(u,tm,end);
                                if(tp==-1)return -1;
                        }else{
                                int tp = dfs(u,tm,end);
                                if(tp==-1)return -1;
                        }
                        
                }
        }
        return 1;
}
 
int main()
{
        ios_base::sync_with_stdio(0);cin.tie(NULL);cout.tie(NULL);
        cin>>n>>ST>>EN;

        for(int i=1; i<n; i++){
                int v,u,w; cin>>v>>u>>w;
                if(w==0){
                        mp[v][u] = 1;
                        mp[u][v] = 1;
                }
                eg[v].push_back({u,w});
                eg[u].push_back({v,w});
                g[v].push_back(u);
                g[u].push_back(v);
        }
        pre_LCA();
        ORDER.push_back(ST);
        int tp = dfs(ST,1,EN);
        ORDER.push_back(EN);
        if(tp==-1){
                cout<<"-1"<<endl;
        }else{
                ll ans = 0 , sz=ORDER.size();
                for(int i=1; i<sz; i++){
                        int v = ORDER[i-1] , u=ORDER[i];
                        ans += h[v]+h[u]-h[LCA(v,u)]-h[LCA(v,u)]; 
                }
                cout<<ans;
        }
        return 0;
}
/*
6
1 6
1 2 0
2 3 0
2 4 5
2 5 3
5 6 4
ans = 14;
*/
/**
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;
*/
# 결과 실행 시간 메모리 Grader output
1 Correct 41 ms 94284 KB Output is correct
2 Correct 41 ms 94292 KB Output is correct
3 Correct 241 ms 182084 KB Output is correct
4 Correct 234 ms 182092 KB Output is correct
5 Correct 230 ms 182124 KB Output is correct
6 Correct 238 ms 182096 KB Output is correct
7 Correct 230 ms 182200 KB Output is correct
8 Correct 219 ms 182332 KB Output is correct
9 Correct 230 ms 182632 KB Output is correct
10 Correct 221 ms 182320 KB Output is correct
11 Correct 225 ms 182416 KB Output is correct
12 Correct 219 ms 183576 KB Output is correct
13 Incorrect 204 ms 185052 KB Output isn't correct
14 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 42 ms 94284 KB Output is correct
2 Correct 42 ms 94264 KB Output is correct
3 Incorrect 43 ms 94408 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 41 ms 94284 KB Output is correct
2 Correct 41 ms 94292 KB Output is correct
3 Correct 241 ms 182084 KB Output is correct
4 Correct 234 ms 182092 KB Output is correct
5 Correct 230 ms 182124 KB Output is correct
6 Correct 238 ms 182096 KB Output is correct
7 Correct 230 ms 182200 KB Output is correct
8 Correct 219 ms 182332 KB Output is correct
9 Correct 230 ms 182632 KB Output is correct
10 Correct 221 ms 182320 KB Output is correct
11 Correct 225 ms 182416 KB Output is correct
12 Correct 219 ms 183576 KB Output is correct
13 Incorrect 204 ms 185052 KB Output isn't correct
14 Halted 0 ms 0 KB -