Submission #634795

#TimeUsernameProblemLanguageResultExecution timeMemory
634795tamthegodCake 3 (JOI19_cake3)C++14
0 / 100
31 ms62980 KiB
#include<bits/stdc++.h>

#define int long long
#define pb push_back
#define fi first
#define se second
using namespace std;
using ll = long long;
using ld = long double;
using ull = unsigned long long;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const int maxN = 2e5 + 5;
const int mod = 1e9 + 7;
const ll oo = 1e18;
vector<int> a;
vector <int> val[maxN * 4];
vector <int> sum[maxN * 4];
int node_cnt = 1;

struct TNode
{
    int l, r;
    int lp, rp;
    TNode()
    {
        l = r = lp = rp = 0;
    }
    TNode(int _l, int _r)
    {
        l = _l;
        r = _r;
    }
};
TNode wt[maxN * 4];

void build(int id, auto i, auto j, int l, int r)
{
    wt[id].l = l;
    wt[id].r = r;
    if (l == r)
    {
        return;
    }
    val[id].pb(0);
    sum[id].pb(0);
    int mid = (l + r - (l + r < 0)) / 2;
    int _max = l;
    int _min = r;
    for(auto it = i; it != j; ++it)
    {
        val[id].pb(val[id].back() + (*it <= mid));
        sum[id].pb(sum[id].back() + *it * (*it <= mid));
        if (*it <= mid) _max = max(_max, *it);
        else _min = min(_min, *it);
    }
    auto p = stable_partition(i, j,[=](const auto &w)
    {
        return w <= mid;
    });
    wt[id].lp = ++node_cnt;
    wt[id].rp = ++node_cnt;
    build(wt[id].lp, i, p, l, _max);
    build(wt[id].rp, p, j, _min, r);
}

ll get(int k, int i, int j)
{
    if (k == 0) return 0;
    --i;
    ll res = 0;
    int id = 1;
    int l = wt[id].l, r = wt[id].r;
    while (l < r)
    {
        int mid = (l + r) / 2;
        if (k <= val[id][j] - val[id][i])
        {
            i = val[id][i];
            j = val[id][j];
            id = wt[id].lp;
        }
        else
        {
            res += sum[id][j] - sum[id][i];
            k -= val[id][j] - val[id][i];
            i -= val[id][i];
            j -= val[id][j];
            id = wt[id].rp;
        }
        l = wt[id].l, r = wt[id].r;
    }
    res += k * l;
    return res;
}

int n, m;
pair<int, int> cake[maxN];
int f[maxN];
void ReadInput()
{
    cin >> n >> m;
    for(int i=1; i<=n; i++) cin >> cake[i].fi >> cake[i].se;
}
void Solve()
{
    sort(cake + 1, cake + n + 1, [](pair<int, int> p, pair<int, int> q)
    {
        return p.se < q.se;
    });
    a.resize(n + 1);
    for(int i=1; i<=n; i++) a[i] = -cake[i].fi;
    build(1, a.begin() + 1, a.end(), *min_element(a.begin() + 1, a.end()), *max_element(a.begin() + 1, a.end()));
    for(int i=m; i<=n; i++)
        for(int j=i-m+1; j>=1; j--)
        {
            f[i] = max(f[i], -get(m, j, i) - (cake[i].se - cake[j].se) * 2);
          //  cout << f[j - 1] + cake[i].fi + cake[j].fi + -get(m - 2, j + 1, i - 1) - (cake[i].se - cake[j].se) * 2;return;
        }
    cout << *max_element(f + m, f + n + 1);
}
int32_t main()
{
    //freopen("x.inp", "r", stdin);
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    ReadInput();
    Solve();
}

Compilation message (stderr)

cake3.cpp:36:20: warning: use of 'auto' in parameter declaration only available with '-fconcepts-ts'
   36 | void build(int id, auto i, auto j, int l, int r)
      |                    ^~~~
cake3.cpp:36:28: warning: use of 'auto' in parameter declaration only available with '-fconcepts-ts'
   36 | void build(int id, auto i, auto j, int l, int r)
      |                            ^~~~
cake3.cpp: In function 'll get(long long int, long long int, long long int)':
cake3.cpp:75:13: warning: unused variable 'mid' [-Wunused-variable]
   75 |         int mid = (l + r) / 2;
      |             ^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...