제출 #1351718

#제출 시각아이디문제언어결과실행 시간메모리
1351718xorreverseRace (IOI11_race)C++20
100 / 100
762 ms114624 KiB
#include<bits/stdc++.h>
#include "race.h"
using namespace std;
const int maxN = 2e5 + 5;
int n, k;
struct edge{
    int v, w;
};
vector<edge> e[maxN];
bool vis[maxN];
int step[maxN];long long dep[maxN];
int f[maxN][105];
namespace sub2{
    int bfs(int u){
        memset(vis, 0, sizeof(vis));
        memset(step, 0, sizeof(step));
        memset(dep, 0, sizeof(dep));
        queue<int> q;
        q.push(u);
        vis[u] = 1;
        int res = 1e9;
        while (!q.empty()){
            int u = q.front();
            if (dep[u] == k){
                res = min(res, step[u]);
            }
            q.pop();
            for (auto v : e[u]){
                if (vis[v.v]) continue;
                vis[v.v] = 1;
                step[v.v] = step[u] + 1;
                dep[v.v] = dep[u] + v.w;
                q.push(v.v);
            }
        }
        return res;
    }
    int solve(){
        int ans = 1e9;
        for (int i = 0; i < n; i ++){
            ans = min(ans, bfs(i));
        }
        if (ans >= n) ans = -1;
        return ans;
    }
}
namespace sub3{
    int res = 1e9;
    void dfs(int p, int u){
        for (auto v : e[u]){
            if (v.v == p) continue;
            dfs(u, v.v);
            for (int g = 0; g <= k; g ++) if (k - (g + v.w) >= 0 && (k - (g + v.w)) <= k)res = min(res, 1 + f[v.v][g] + f[u][k - (g + v.w)]);
            for (int g = 0; g + v.w <= k; g ++){
                f[u][g + v.w] = min(f[u][g + v.w], f[v.v][g] + 1);
            }
        }
        res = min(res, f[u][k]);
        f[u][0] = 0;
    }
    int solve(){
        memset(f, 0x3f, sizeof(f));
        dfs(0, 0);
        if (res > n) return -1;
        else return res;
    }
}
namespace sub4{
    struct query{
        map<int, int> cur;
        int hs;
    };
    int res = 1e9;
    void pre_cal(int p, int u){
        for (auto v : e[u]){
            if (v.v == p) continue;
            step[v.v] = step[u] + 1;
            pre_cal(u, v.v);
        }
    }
    query dfs(int p, int u){
        query cur;
        cur.hs = 0;
        cur.cur[0] = step[u];
        for (auto v : e[u]){
            if (v.v == p) continue;
            query tmp = dfs(u, v.v);
            tmp.hs += v.w;
            if (tmp.cur.size() > cur.cur.size()) swap(tmp, cur);
            for (auto j : tmp.cur){
                int real_fac = j.first + tmp.hs;
                int st = cur.cur[(k - real_fac) - cur.hs];
                if (st && j.second) res = min(res, st + j.second - 2 * step[u]);
             //   if (u == 0 && v.v == 5) cout << (k - real_fac) << '\n';
            //if (st + j.second - 2 * step[u] == -6) cout << u << " " << st << " " << j.second << " " << v.v << '\n';
           }
            for (auto j : tmp.cur){
                if (!j.second) continue;
                int fuq = j.first + tmp.hs - cur.hs;
                if (cur.cur[fuq] == 0){
                    cur.cur[fuq] = j.second;
                }
                else{
                    cur.cur[fuq] = min(cur.cur[fuq], j.second);
                }
            }
        }
      //  if (u == 22) for (auto j : cur.cur) cout << j.first + cur.hs << " " << j.second << '\n';
        return cur;

    }
    int solve(){
        step[0] = 1;
        pre_cal(0, 0);
        dfs(0, 0);
        if (res > n) return -1;
        else return res;;
    }
}

int best_path(int N, int K, int H[][2], int L[])
{
    n = N;
    k = K;
    for (int i = 0; i < n - 1; i ++){
        int u, v, l;
        u = H[i][0];
        v = H[i][1];
        l = L[i];
        e[u].push_back({v, l});
        e[v].push_back({u, l});
    }
    if (n <= 1000 && k <= 1000000){
        return sub2::solve();
    }
    else if (n <= 200000 && k <= 100){
        return sub3::solve();
    }
    else{
        return sub4::solve();
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...