제출 #1164948

#제출 시각아이디문제언어결과실행 시간메모리
1164948vladilius은하철도 (APIO24_train)C++20
5 / 100
1096 ms11192 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
#define pb push_back
#define ff first
#define ss second
const ll inf = 1e18;
const int A = 1e9;

ll solve(int n, int m, int w, vector<int> t, vector<int> x, vector<int> y, vector<int> a, vector<int> b, vector<int> c, vector<int> l, vector<int> r){
    vector<int> g[n + 1];
    for (int i = 0; i < m; i++){
        x[i]++; y[i]++;
        g[y[i]].pb(i);
    }
    
    t.insert(t.begin(), 0);
    
    vector<pii> all;
    for (int i = 0; i < w; i++){
        all.pb({l[i], r[i]});
    }
    
    auto f = [&](int l, int r){
        int out = 0;
        for (auto [x, y]: all){
            out += (l < x && y < r);
        }
        return out;
    };
    
    vector<pii> ed;
    for (int i = 0; i < m; i++){
        ed.pb({a[i], i});
    }
    sort(ed.begin(), ed.end());
    
    vector<ll> dp(m, inf);
    ll out = inf;
    for (auto [B, i]: ed){
        ll mn = inf;
        for (int j: g[x[i]]){
            if (b[j] <= a[i]){
                mn = min(mn, dp[j] + 1LL * t[x[i]] * f(b[j], a[i]));
            }
        }
        
        if (x[i] == 1) mn = min(mn, 1LL * t[x[i]] * f(0, a[i]));
        dp[i] = mn + c[i];

        if (y[i] == n){
            out = min(out, dp[i] + 1LL * t[n] * f(b[i], A + 1));
        }
    }
    
    if (out == inf) return -1;

    return out;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...