제출 #1364285

#제출 시각아이디문제언어결과실행 시간메모리
1364285gmroh06Hawaiki (KAISTRUN26SPRING_H)C++20
100 / 100
420 ms144624 KiB
#include <bits/stdc++.h>
using namespace std;
 
using ll = long long;
using tll = tuple<ll, ll, ll>;
 
void init() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
}
 
int main() {
    init();
 
    ll n, m;
    cin >> n >> m;
    vector<ll> x(n + 1), y(n + 1);
    for (ll i = 1; i <= n; i++) {
        cin >> x[i] >> y[i];
    }
    vector<vector<tll>> gr(n + 1);
    for (ll u, v, w, i = 1; i <= m; i++) {
        cin >> u >> v >> w;
        gr[u].emplace_back(v, w, i);
    }
    for (ll i = 1; i <= n; i++) {
        ranges::sort(gr[i], [&](tll ap, tll bp) {
            ll a = get<0>(ap), b = get<0>(bp);
            ll ax = x[a] - x[i], ay = y[a] - y[i];
            ll bx = x[b] - x[i], by = y[b] - y[i];
            return ax * by - ay * bx > 0;
        });
    }
    gr[1].emplace(gr[1].begin(), n, 0, 0);
    gr[1].emplace_back(n, 0, 0);
 
    vector<ll> dp(n + 1), vst(n + 1), pre(n + 1), pw(n + 1);
    vector<ll> pi(n + 1), ans(m + 1), lv(n + 1);
    function<void(ll)> dfs = [&](ll cur) {
        vst[cur] = 1;
        for (auto& [nxt, w, i] : gr[cur]) {
            if (vst[nxt]) {
                ll v, mx = 0;
                for (v = nxt; vst[v] != 1; v = pre[v]) {
                    mx = max(mx, dp[v]);
                }
                for (v = nxt; vst[v] != 1; v = pre[v]) {
                    ans[pi[v]] = mx - lv[v];
                }
                pre[nxt] = cur;
                pw[nxt] = w;
                pi[nxt] = i;
                for (ll u = nxt; u != v; u = pre[u]) {
                    lv[u] = mx;
                    dp[u] = mx + pw[u];
                }
            } else {
                pre[nxt] = cur;
                pw[nxt] = w;
                pi[nxt] = i;
                dfs(nxt);
            }
        }
        vst[cur] = 2;
    };
    dfs(1);
 
    for (ll i = 1; i <= m; i++) {
        cout << ans[i] << '\n';
    }
    return 0;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…