Submission #920371

#TimeUsernameProblemLanguageResultExecution timeMemory
920371zeta7532Autobahn (COI21_autobahn)C++17
100 / 100
168 ms16492 KiB
#include <bits/stdc++.h>
#pragma GCC target("avx2")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
using namespace std;
using ll = long long;
const ll mod = 998244353;
#define fi first
#define se second
#define rep(i,n) for(ll i=0;i<n;i++)
#define all(x) x.begin(),x.end()
#define faster ios::sync_with_stdio(false);cin.tie(nullptr)

ll f(ll x,ll a,ll va,ll b,ll vb){
    ll ans=0;
    if(va<vb){
        swap(a,b);
        swap(va,vb);
    }
    ans+=va*min(x,a);
    x-=min(x,a);
    ans+=vb*min(x,b);
    x-=min(x,b);
    return ans;
}

int main() {
    ll N,K,X;
    cin >> N >> K >> X;
    vector<ll> l(N),t(N),r(N);
    vector<ll> x;
    rep(i,N){
        cin >> l[i] >> t[i] >> r[i];
        x.push_back(l[i]);
        x.push_back(r[i]+1);
        if(l[i]+t[i]<=r[i]){
            x.push_back(l[i]+t[i]);
        }
    }
    x.push_back(0);
    x.push_back(1LL<<30);
    sort(all(x));
    x.erase(unique(all(x)),x.end());
    ll M=x.size()-1;
    vector<ll> A(M,0);
    vector<ll> B(M,0);
    rep(i,N){
        ll a=lower_bound(all(x),l[i])-x.begin();
        ll b=lower_bound(all(x),l[i]+t[i])-x.begin();
        ll c=lower_bound(all(x),r[i]+1)-x.begin();
        A[a]++;
        A[c]--;
        if(l[i]+t[i]<=r[i]){
            B[b]++;
            B[c]--;
        }
    }
    rep(i,M-1) A[i+1]+=A[i],B[i+1]+=B[i];
    vector<ll> cum(M,0);
    if(A[0]>=K) cum[0]+=B[0]*(x[1]-x[0]);
    for(ll i=1;i<M;i++){
        cum[i]=cum[i-1];
        if(A[i]>=K) cum[i]+=B[i]*(x[i+1]-x[i]);
    }
    ll ans=0;
    for(ll i=1;i<M;i++){
        ll ok=i,ng=M;
        while(ng-ok>1){
            ll mid=(ok+ng)/2;
            if(x[mid]>x[i]+X) ng=mid;
            else ok=mid;
        }
        ll len=X-(x[ok]-x[i]);
        ll l=x[i]-x[i-1];
        ll val_l=0;
        if(A[i-1]>=K) val_l=B[i-1];
        ll r=x[ok+1]-x[ok];
        ll val_r=0;
        if(A[ok]>=K) val_r=B[ok];
        ll cnt=cum[ok-1]-cum[i-1]+f(len,l,val_l,r,val_r);
        ans=max(ans,cnt);
        if(i==ok) continue;
        i++;
        len=X-(x[ok]-x[i]);
        l=x[i]-x[i-1];
        val_l=0;
        if(A[i-1]>=K) val_l=B[i-1];
        r=x[ok+1]-x[ok];
        val_r=0;
        if(A[ok]>=K) val_r=B[ok];
        cnt=cum[ok-1]-cum[i-1]+f(len,l,val_l,r,val_r);
        ans=max(ans,cnt);
        i--;
    }
    cout << ans << endl;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...