답안 #993717

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
993717 2024-06-06T10:35:51 Z gortomi 공장들 (JOI14_factories) C++17
0 / 100
2328 ms 267632 KB
#include <bits/stdc++.h>
#include "factories.h"

//#include "grader.cpp"
using namespace std;
using ll = long long;
using pii = pair<ll, ll>;
vector<vector<pii> > g;
vector<bool> vis;
vector<int> s;
vector<vector<ll> > d;
vector<vector<int> > pa;
vector<ll> mini;
void calc(int v, int p)
{
    s[v] = 1;
    for(auto [x, w] : g[v])
    {
        if(vis[x]) continue;
        if(x == p) continue;
        calc(x, v);
        s[v] += s[x];
    }
}
int findc(int v, int p, int bp)
{

    for(auto [x, w] : g[v])
    {
        if(x == p || vis[x]) continue;
        if(s[bp] / 2 < s[x]) return findc(x, v, bp);
    }
    return v;
}
void calc2(int v, int p, ll dep, int l, int bp)
{
    pa[v][l] = bp;
    d[v][l] = dep;
    for(auto [x, w] : g[v])
    {
        if(x == p || vis[x]) continue;
        calc2(x, v, dep + w, l, bp);
    }
}
void dec(int v, int l)
{

    calc(v, 0);
    int c = findc(v, 0, v);
    vis[c] = 1;
    calc2(c, 0, 0, l, c);

    for(auto [x, w] : g[c])
    {

        if(!vis[x]) dec(x, l + 1);

    }
}
ll Query(int t, int b[], int s, int a[])
{
    vector<int> ve;
    for(int i = 0; i < s; i++)
    {
        int x = a[i];
        for(int j = 0; j < 20; j++)
        {
            int v = pa[x][j];
            if(v != 0)
            {
                mini[v] = min(mini[v], d[x][j]);
                ve.push_back(v);
            }
        }
    }
    ll ans = 1e15;
    for(int i = 0; i < t; i++)
    {
        int x = b[i];
        ll act = 1e15;
        for(int j = 0; j < 20; j++)
        {
            int v = pa[x][j];
            if(v != 0)
            {
                act = min(act, mini[v] + d[x][j]);
            }
        }
        ans = min(act, ans);
    }
    for(auto x : ve) mini[x] = 1e15;
    return ans;
}
void Init(int n, int a[], int b[], int c[])
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    /*int n, q;
    cin >> n >> q;*/
    g.resize(n);
    vis.resize(n);
    s.resize(n);
    d.resize(n, vector<ll>(20));
    pa.resize(n, vector<int>(20));
    mini.resize(n, 1e15);
    for(int i = 0; i < n - 1; i++)
    {
        ll x = a[i], y = b[i], w = c[i];
        /*int x, y, w;
        cin >> x >> y >> w;*/
        g[x].push_back({y, w});
        g[y].push_back({x, w});
    }
    dec(1, 0);
    /*while(q--)
    {
        int s, t;
        cin >> s >> t;
        int a[s], b[t];
        for(int i = 0; i < s; i++) cin >> a[i];
        for(int i = 0; i < t; i++) cin >> b[i];
        cout << Query(s, a, t, b) << "\n";
    }*/
}
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 16984 KB Output is correct
2 Correct 251 ms 32596 KB Output is correct
3 Incorrect 239 ms 32336 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 16988 KB Output is correct
2 Correct 1459 ms 223680 KB Output is correct
3 Correct 1982 ms 238472 KB Output is correct
4 Correct 729 ms 231048 KB Output is correct
5 Correct 2328 ms 267632 KB Output is correct
6 Correct 2023 ms 237856 KB Output is correct
7 Correct 628 ms 69672 KB Output is correct
8 Incorrect 441 ms 68828 KB Output isn't correct
9 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 16984 KB Output is correct
2 Correct 251 ms 32596 KB Output is correct
3 Incorrect 239 ms 32336 KB Output isn't correct
4 Halted 0 ms 0 KB -