Submission #1349212

#TimeUsernameProblemLanguageResultExecution timeMemory
1349212AndreyTeleporter 2 (JOI26_teleporter)C++20
100 / 100
2019 ms16876 KiB
#include<bits/stdc++.h>
using namespace std;

vector<pair<long long,long long>> idk[100001];
vector<pair<long long,long long>> seg(400001);
vector<long long> wow(400001);
long long n,m,k;

void build(long long l, long long r, long long x) {
    seg[x] = {-1000000000000000000LL,0};
    wow[x] = 0;
    if(l == r) {
        return;
    }
    long long mid = (l+r)/2;
    build(l,mid,x*2);
    build(mid+1,r,x*2+1);
}

void upd(long long l, long long r, long long x, long long ql, long long qr, pair<long long,long long> br) {
    if(l > qr || r < ql) {
        return;
    }
    if(l >= ql && r <= qr) {
        if(br.second != 1) {
            seg[x] = br;
            return;
        }
        seg[x] = {seg[x].first+br.first,seg[x].second};
        wow[x]+=br.first;
        return;
    }
    long long mid = (l+r)/2;
    upd(l,mid,x*2,ql,qr,br);
    upd(mid+1,r,x*2+1,ql,qr,br);
    seg[x] = max(seg[x*2],seg[x*2+1]);
    seg[x] = {seg[x].first+wow[x],seg[x].second};
}

pair<long long,long long> calc(long long lamb) {
    build(0,n,1);
    vector<pair<long long,long long>> dp(n+1);
    upd(0,n,1,0,0,{0,0});
    for(long long i = 1; i <= n; i++) {
        for(pair<long long,long long> v: idk[i]) {
            upd(0,n,1,v.first,i-1,{v.second,1});
        }
        dp[i] = max(dp[i-1],{seg[1].first-lamb,seg[1].second-1});
        upd(0,n,1,i,i,{dp[i].first,dp[i].second});
    }
    return {dp[n].first,-dp[n].second};
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    long long a,b,c,sb = 0;
    cin >> n >> m >> k;
    for(long long i = 0; i < m; i++) {
        cin >> a >> b >> c;
        idk[b].push_back({a,c});
        sb+=c;
    }
    long long l = 0,r = 100000000000000LL;
    while(l < r) {
        long long mid = (l+r+1)/2;
        if(calc(mid).second >= k) {
            l = mid;
        }
        else {
            r = mid-1;
        }
    }
    pair<long long,long long> y = calc(l),z = calc(l+1);
    y = {y.first+y.second*l,y.second};
    z = {z.first+z.second*(l+1),z.second};
    if(y.second <= k) {
        cout << sb-y.first;
        return 0;
    }
    long long d =  (z.first-y.first)/(y.second-z.second);
    long long ans = y.first+(y.second-k)*d;
    cout << sb-ans;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...