답안 #979833

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
979833 2024-05-11T13:08:14 Z Mher777 자매 도시 (APIO20_swap) C++17
7 / 100
623 ms 524288 KB
#include "swap.h"
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <iomanip>
#include <array>
#include <string>
#include <algorithm>
#include <cmath>
#include <set>
#include <map>
#include <unordered_set>
#include <unordered_map>
#include <vector>
#include <stack>
#include <queue>
#include <deque>
#include <bitset>
#include <list>
#include <iterator>
#include <numeric>
#include <complex>
#include <utility>
#include <random>
#include <cassert>
#include <fstream>
using namespace std;
mt19937 rnd(7069);
typedef int itn;
typedef long long ll;
typedef unsigned long long ull;
typedef double db;
typedef float fl;
typedef long double ld;
using vi = vector<int>;
using vll = vector<ll>;
using mii = map<int, int>;
using mll = map<ll, ll>;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
#define ff first
#define ss second
#define pub push_back
#define pob pop_back
#define puf push_front
#define pof pop_front
#define mpr make_pair
#define yes cout<<"Yes\n"
#define no cout<<"No\n"
#define all(x) (x).begin(), (x).end()
const int dx[8] = { -1, 0, 1, 0, -1, -1, 1, 1 };
const int dy[8] = { 0, -1, 0, 1, -1, 1, -1, 1 };
const int MAX = int(1e9 + 5);
const ll MAXL = ll(1e18) + 5ll;
const ll MOD = ll(1000000007);
const ll MOD2 = ll(998244353);

const int N = 100005;
pii val[N], t[N * 4];
int dep[N], tp[N], id[N], p[N], sub[N];
vector<pii> g[N];
int n, m, timer;

void dfs(int u = 1, int par = 1) {
    sub[u] = 1;
    p[u] = par;
    for (auto to : g[u]) {
        if (to.ss == par) continue;
        dep[to.ss] = dep[u] + 1;
        dfs(to.ss, u);
        sub[u] += sub[to.ss];
    }
}

void dfs_hld(int u = 1, int top = 1, ll cur = 0) {
    tp[u] = top;
    id[u] = ++timer;
    val[id[u]] = { cur,MAX };
    if ((int)g[u].size() >= 3) {
        val[id[u]].ss = g[u][2].ff;
    }
    int mx = 0, v = -1;
    ll curx = 0;
    for (auto to : g[u]) {
        if (to.ss == p[u]) continue;
        if (sub[to.ss] > mx) {
            mx = sub[to.ss];
            v = to.ss;
            curx = to.ff;
        }
    }
    if (v != -1) dfs_hld(v, top, curx);
    for (auto to : g[u]) {
        if (to.ss == p[u] || to.ss == v) continue;
        dfs_hld(to.ss, to.ss, to.ff);
    }
}

void bld(int l = 1, int r = n, int pos = 1) {
    if (l == r) {
        t[pos] = val[l];
        return;
    }
    int mid = (l + r) / 2;
    bld(l, mid, 2 * pos);
    bld(mid + 1, r, 2 * pos + 1);
    t[pos].ff = max(t[2 * pos].ff, t[2 * pos + 1].ff);
    t[pos].ss = min(t[2 * pos].ss, t[2 * pos + 1].ss);
}

int qry(int l, int r, int type, int tl = 1, int tr = n, int pos = 1) {
    if (l == tl && r == tr) {
        return (type == 1 ? t[pos].ff : t[pos].ss);
    }
    int mid = (tl + tr) / 2;
    if (mid >= r) {
        return qry(l, r, type, tl, mid, 2 * pos);
    }
    if (mid < l) {
        return qry(l, r, type, mid + 1, tr, 2 * pos + 1);
    }
    if (type == 1) {
        return max(qry(l, mid, type, tl, mid, 2 * pos), qry(mid + 1, r, type, mid + 1, tr, 2 * pos + 1));
    }
    return min(qry(l, mid, type, tl, mid, 2 * pos), qry(mid + 1, r, type, mid + 1, tr, 2 * pos + 1));
}

void init(int N, int M, vi U, vi V, vi W) {
    n = N, m = M;
    for (int i = 0; i < m; ++i) {
        ++U[i];
        ++V[i];
        g[U[i]].pub({ W[i],V[i] });
        g[V[i]].pub({ W[i],U[i] });
    }
    for (int i = 1; i <= n; ++i) {
        sort(all(g[i]));
    }
    dfs();
    dfs_hld();
    bld();
}

int query1(int x, int y) {
    int ret = 0;
    while (tp[x] != tp[y]) {
        if (dep[tp[x]] < dep[tp[y]]) swap(x, y);
        ret = max(ret, qry(id[tp[x]], id[x], 1));
        x = p[tp[x]];
    }
    if (dep[x] > dep[y]) swap(x, y);
    if (x == y) return ret;
    ret = max(ret, qry(id[x] + 1, id[y], 1));
    return ret;
}

int query2(int x, int y) {
    int ret = MAX;
    while (tp[x] != tp[y]) {
        if (dep[tp[x]] < dep[tp[y]]) swap(x, y);
        ret = min(ret, qry(id[tp[x]], id[x], 2));
        x = p[tp[x]];
    }
    if (dep[x] > dep[y]) swap(x, y);
    ret = min(ret, qry(id[x], id[y], 2));
    return ret;
}

int getMinimumFuelCapacity(int X, int Y) {
    int x = X, y = Y;
    ++x, ++y;
    int num1 = query1(x, y), num2 = query2(x, y);
    if (num2 == MAX) return -1;
    return max(num1, num2);
}

/*
15 14
0 1 1
0 2 1
1 3 2
1 4 1
2 5 1
2 6 1
3 7 1
3 8 1
4 9 1
4 10 1
5 11 1
5 12 1
6 13 1
6 14 1
1
*/
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 6748 KB Output is correct
2 Correct 1 ms 6748 KB Output is correct
3 Correct 1 ms 6744 KB Output is correct
4 Correct 1 ms 6748 KB Output is correct
5 Correct 2 ms 6748 KB Output is correct
6 Correct 2 ms 6748 KB Output is correct
7 Correct 2 ms 6748 KB Output is correct
8 Correct 2 ms 6744 KB Output is correct
9 Correct 39 ms 15248 KB Output is correct
10 Correct 49 ms 18652 KB Output is correct
11 Correct 53 ms 17808 KB Output is correct
12 Correct 53 ms 18772 KB Output is correct
13 Correct 54 ms 20564 KB Output is correct
14 Correct 54 ms 14760 KB Output is correct
15 Correct 214 ms 20188 KB Output is correct
16 Correct 216 ms 18312 KB Output is correct
17 Correct 203 ms 22460 KB Output is correct
18 Correct 216 ms 20920 KB Output is correct
19 Runtime error 623 ms 524288 KB Execution killed with signal 9
20 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 6748 KB Output is correct
2 Correct 1 ms 6748 KB Output is correct
3 Correct 173 ms 16488 KB Output is correct
4 Correct 182 ms 18940 KB Output is correct
5 Correct 182 ms 19036 KB Output is correct
6 Correct 171 ms 18732 KB Output is correct
7 Correct 190 ms 18928 KB Output is correct
8 Correct 179 ms 18668 KB Output is correct
9 Correct 182 ms 18756 KB Output is correct
10 Correct 177 ms 18620 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 6748 KB Output is correct
2 Correct 1 ms 6748 KB Output is correct
3 Correct 1 ms 6744 KB Output is correct
4 Correct 1 ms 6748 KB Output is correct
5 Correct 2 ms 6748 KB Output is correct
6 Correct 2 ms 6748 KB Output is correct
7 Correct 2 ms 6748 KB Output is correct
8 Correct 2 ms 6744 KB Output is correct
9 Runtime error 293 ms 524288 KB Execution killed with signal 9
10 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 293 ms 524288 KB Execution killed with signal 9
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 6748 KB Output is correct
2 Correct 1 ms 6748 KB Output is correct
3 Correct 1 ms 6744 KB Output is correct
4 Correct 1 ms 6748 KB Output is correct
5 Correct 2 ms 6748 KB Output is correct
6 Correct 2 ms 6748 KB Output is correct
7 Correct 2 ms 6748 KB Output is correct
8 Correct 2 ms 6744 KB Output is correct
9 Correct 39 ms 15248 KB Output is correct
10 Correct 49 ms 18652 KB Output is correct
11 Correct 53 ms 17808 KB Output is correct
12 Correct 53 ms 18772 KB Output is correct
13 Correct 54 ms 20564 KB Output is correct
14 Correct 54 ms 14760 KB Output is correct
15 Correct 214 ms 20188 KB Output is correct
16 Correct 216 ms 18312 KB Output is correct
17 Correct 203 ms 22460 KB Output is correct
18 Correct 216 ms 20920 KB Output is correct
19 Correct 173 ms 16488 KB Output is correct
20 Correct 182 ms 18940 KB Output is correct
21 Correct 182 ms 19036 KB Output is correct
22 Correct 171 ms 18732 KB Output is correct
23 Correct 190 ms 18928 KB Output is correct
24 Correct 179 ms 18668 KB Output is correct
25 Correct 182 ms 18756 KB Output is correct
26 Correct 177 ms 18620 KB Output is correct
27 Correct 2 ms 6748 KB Output is correct
28 Correct 2 ms 6744 KB Output is correct
29 Correct 2 ms 6748 KB Output is correct
30 Correct 2 ms 6748 KB Output is correct
31 Correct 2 ms 6748 KB Output is correct
32 Incorrect 2 ms 6748 KB Output isn't correct
33 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 293 ms 524288 KB Execution killed with signal 9
2 Halted 0 ms 0 KB -