Submission #520602

#TimeUsernameProblemLanguageResultExecution timeMemory
520602VimmerAutobahn (COI21_autobahn)C++14
100 / 100
108 ms8112 KiB
#include <bits/stdc++.h>
#define in(x) freopen(x, "r", stdin)
#define out(x) freopen(x, "w", stdout)

//#pragma GCC optimize("Ofast")
//#pragma GCC optimize("unroll-loops")
//#pragma GCC optimize("-O3")

#define F first
#define S second
#define PB push_back
#define M ll(1e9 + 7)
#define sz(x) (ll)x.size()
#define N 100500
#define pri(x) cout << x << endl
#define endl '\n'
#define all(x) (x).begin(), (x).end()
#define _ << " " <<

using namespace std;
//typedef tree <ll, null_type, less_equal <ll> , rb_tree_tag, tree_order_statistics_node_update> ordered_set;
//using namespace __gnu_pbds;
typedef long long ll;
typedef long double ld;
typedef short int si;
typedef unsigned long long ull;

ll a[N];

int main()
{
    istream::sync_with_stdio(0); ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);

    int n, k, x;

    cin >> n >> k >> x;

    vector <int> vr; vr.clear();

    vector <int> dob; dob.clear();
    vector <int> del; del.clear();

    vector <int> db; db.clear();
    vector <int> dl; dl.clear();

    for (int i = 0; i < n; i++)
    {
        int l, r, t;

        cin >> l >> t >> r;

        dob.PB(l);

        del.PB(r + 1);

        vr.PB(r);

        if (l + t <= r)
        {
            db.PB(l + t);

            dl.PB(r + 1);
        }
    }

    sort(all(vr));

    vector <int> al; al.clear();

    vr.resize(unique(all(vr)) - vr.begin());

    vector <pair <int, int> > beg; beg.clear();

    vector <pair <int, int> > ed; ed.clear();

    for (int i = 0; i < sz(vr); i++)
    {
        beg.PB({max(1, vr[i] - x + 1), i});

        ed.PB({vr[i] + 1, i});
    }

    sort(all(beg));
    sort(all(ed));
    sort(all(dob));
    sort(all(del));
    sort(all(db));
    sort(all(dl));

    for (auto it : beg)
        al.PB(it.F);
    for (auto it : ed)
        al.PB(it.F);
    for (auto it : dob)
        al.PB(it);
    for (auto it : del)
        al.PB(it);
    for (auto it : db)
        al.PB(it);
    for (auto it : dl)
        al.PB(it);

    sort(all(al));

    ll ans = 0, cur = 0;

    int i1 = 0, i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0;

    int skok = 0, kol = 0;

    int lst = 0;

    for (auto x : al)
    {
//        pri(x _ cur);

        int len = x - lst;

        lst = x;

        if (skok >= k)
            cur += 1ll * len * kol;

        while (i1 < sz(beg) && beg[i1].F == x)
        {
            a[beg[i1].S] = cur;

            i1++;
        }

        while (i2 < sz(ed) && ed[i2].F == x)
        {
            ans = max(ans, cur - a[ed[i2].S]);

            i2++;
        }

        while (i3 < sz(dob) && dob[i3] == x)
        {
            skok++;

            i3++;
        }

        while (i4 < sz(del) && del[i4] == x)
        {
            skok--;

            i4++;
        }

        while (i5 < sz(db) && db[i5] == x)
        {
            kol++;

            i5++;
        }

        while (i6 < sz(dl) && dl[i6] == x)
        {
            kol--;

            i6++;
        }
    }

    pri(ans);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...