제출 #1364580

#제출 시각아이디문제언어결과실행 시간메모리
1364580HasanV11010238Teleporter 2 (JOI26_teleporter)C++20
0 / 100
0 ms344 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define INF 1000000000000000000
int n;
vector<ll> tr, lz;
void relax(int v, int l, int r){
    tr[v] += lz[v];
    if (l != r){
        lz[v * 2] += lz[v], lz[v * 2 + 1] += lz[v];
    }
    lz[v] = 0;
}
void updater(int v, int l, int r, int ql, int qr,ll val){
    relax(v, l, r);
    if (l > qr || r < ql) return;
    if (ql <= l && r <= qr){
        lz[v] += val;
        relax(v, l, r);
        return;
    }
    int mid = (l + r) / 2;
    updater(v * 2, l, mid, ql, qr, val);
    updater(v * 2 + 1, mid + 1, r, ql, qr, val);
    tr[v] = min(tr[v * 2], tr[v * 2 + 1]);
}
void updatep(int v, int l, int r, int pos, ll val){
    relax(v, l, r);
    if (l == r){
        tr[v] = min(val, tr[v]);
        return;
    }
    int mid = (l + r) / 2;
    if (pos <= mid){
        updatep(v * 2, l, mid, pos, val);
        relax(v * 2 + 1, mid + 1, r);
    }
    else{
        updatep(v * 2 + 1, mid + 1, r, pos, val);
        relax(v * 2, l, mid);
    }
    tr[v] = min(tr[v * 2], tr[v * 2 + 1]);
}
ll query(int v, int l, int r, int ql, int qr){
    relax(v, l, r);
    if (l > qr || r < ql) return INF;
    if (ql <= l && r <= qr) return tr[v];
    int mid = (l + r) / 2;
    return min(query(v * 2, l, mid, ql, qr), query(v * 2 + 1, mid + 1, r, ql, qr));
}
int main(){
    ll m, k, l, r, c;
    cin>>n>>m>>k;
    vector<vector<ll>> ra;
    for (int i = 1; i <= m; i++){
        cin>>l>>r>>c;
        ra.push_back({r, l, c, i});
    }
    ra.push_back({1, 1, 0, 0});
    m++;
    sort(ra.begin(), ra.end());
    vector<vector<ll>> dp(m + 1, vector<ll>(k + 1, INF));
    dp[0][0] = 0;
    for (int i = 1; i <= k; i++){
        tr.assign(4 * n + 4, INF), lz.assign(4 * n + 4, 0);
        for (auto &el : ra){
            int ind = el[3];
            dp[ind][i] = query(1, 1, n, 1, el[1]);
            updatep(1, 1, n, el[0], dp[ind][i - 1]);
            updater(1, 1, n, 1, el[1], el[2]); 
        }
    }
    ll ans = INF;
    for (int i = 0; i < m; i++){
        ll co = 0;
        for (int j = i + 1; j < m; j++){
            if (ra[i][0] <= ra[j][1]) co += ra[j][2];
        }
        for (int j = 0; j <= k; j++){
            ans = min(ans, dp[i][j] + co);
        }
    }
    cout<<ans;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…