Submission #938023

# Submission time Handle Problem Language Result Execution time Memory
938023 2024-03-04T18:04:18 Z danikoynov Teams (IOI15_teams) C++14
100 / 100
2388 ms 361548 KB
#include "teams.h"

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

struct segment
{
    int l, r;

    segment(int _l = 0, int _r = 0)
    {
        l = _l;
        r = _r;
    }
};

const int maxn = 5e5 + 10;

struct node
{
    node *lc, *rc;
    int sum;

    node(int _sum = 0)
    {
        lc = rc = NULL;
        sum = _sum;
    }
};

node *update(node *root, int left, int right, int pivot)
{

    if (left == right)
    {
        int val = 1;
        if (root != NULL)
            val += root -> sum;
        return new node(val);
    }

    int mid = (left + right) / 2;
    node *new_root = new node();
    if (root != NULL)
    {
        new_root -> lc = root -> lc; /// try to change this
        new_root -> rc = root -> rc;
    }

    if (pivot <= mid)
        new_root -> lc = update(new_root -> lc, left, mid, pivot);
    else
        new_root -> rc = update(new_root -> rc, mid + 1, right, pivot);

    new_root -> sum = 0;
    if (new_root -> lc != NULL)
        new_root -> sum += new_root -> lc -> sum;
    if (new_root -> rc != NULL)
        new_root -> sum += new_root -> rc -> sum;
    return new_root;
}

int query(node *root, int left, int right, int qleft, int qright)
{
    if (left > qright || right < qleft || root == NULL)
        return 0;

    if (left >= qleft && right <= qright)
        return root -> sum;

    int mid = (left + right) / 2;
    return query(root -> lc, left, mid, qleft, qright) +
           query(root -> rc, mid + 1, right, qleft, qright);
}

int n;
segment s[maxn];
node *root[maxn];
vector < int > upd[maxn];
void init(int N, int A[], int B[])
{
    n = N;
    for (int i = 1; i <= n; i ++)
    {
        s[i] = segment(A[i - 1], B[i - 1]);
        upd[A[i - 1]].push_back(B[i - 1]);
    }

    root[0] = NULL;
    for (int i = 1; i <= n; i ++)
    {
        root[i] = root[i - 1];
        for (int pivot : upd[i])
        {
            root[i] = update(root[i], 1, n, pivot);
        }
    }

    ///exit(0);
}


int zeta(int a, int b)
{
    if (a >= b)
    return 0;
    return query(root[b], 1, n, b, n) - query(root[a], 1, n, b, n);
    /**int cnt = 0;
    for (int i = 1; i <= n; i ++)
    {
        if (s[i].l <= a && s[i].r >= a)
            continue;
        if (s[i].l <= b && s[i].r >= b)
            cnt ++;
    }
    return cnt;*/
}

int pivot_change(int a, int b, int diff)
{
    /// dp_a + z(a, i) > dp_b + z(b, i)
    /// dp_b - dp_a < z(a, i) - z(b, i)
    /// diff < ....
    int lf = b, rf = n;
    while(lf <= rf)
    {
        int mf = (lf + rf) / 2;
        if (diff < zeta(a, mf) - zeta(b, mf))
            lf = mf + 1;
        else
            rf = mf - 1;
    }
    return lf;
}

int dp[maxn];
int can(int M, int K[])
{
    sort(K, K + M);
    set < int > act;
    set < pair < int, int > > event;

    for (int i = 0; i < M; i ++)
    {
        while(!event.empty() && (*event.begin()).first <= K[i])
        {
            set < int > :: iterator it = act.find((*event.begin()).second);
            event.erase({pivot_change(K[*prev(it)], K[*it], dp[*it] - dp[*prev(it)]), *it});
            if (next(it) != act.end())
            {
                event.erase({pivot_change(K[*it], K[*next(it)], dp[*next(it)] - dp[*it]), *next(it)});
                event.insert({pivot_change(K[*prev(it)], K[*next(it)], dp[*next(it)] - dp[*prev(it)]), *next(it)});
            }
            act.erase(it);
        }
        dp[i] = zeta(0, K[i]) - K[i];
        if (!act.empty())
        {
            int bk = *act.rbegin();
            dp[i] = min(dp[i], dp[bk] + zeta(K[bk], K[i]) - K[i]);
        }
        /**for (int j : act)
        {
            dp[i] = min(dp[i], dp[j] + zeta(K[j], K[i]) - K[i]);
        }*/
        if (dp[i] < 0)
            return 0;

        if (!act.empty())
        {
            int bk = *act.rbegin();
            event.insert({pivot_change(K[bk], K[i], dp[i] - dp[bk]), i});
        }
        act.insert(i);
    }
    return 1;
}
# Verdict Execution time Memory Grader output
1 Correct 5 ms 19548 KB Output is correct
2 Correct 4 ms 19548 KB Output is correct
3 Correct 4 ms 19640 KB Output is correct
4 Correct 4 ms 19748 KB Output is correct
5 Correct 4 ms 19544 KB Output is correct
6 Correct 6 ms 19804 KB Output is correct
7 Correct 6 ms 19548 KB Output is correct
8 Correct 5 ms 19548 KB Output is correct
9 Correct 4 ms 19544 KB Output is correct
10 Correct 4 ms 19744 KB Output is correct
11 Correct 4 ms 19544 KB Output is correct
12 Correct 7 ms 19708 KB Output is correct
13 Correct 5 ms 19640 KB Output is correct
14 Correct 5 ms 19548 KB Output is correct
15 Correct 4 ms 19548 KB Output is correct
16 Correct 5 ms 19548 KB Output is correct
17 Correct 6 ms 19548 KB Output is correct
18 Correct 5 ms 19548 KB Output is correct
19 Correct 4 ms 19800 KB Output is correct
20 Correct 4 ms 19748 KB Output is correct
21 Correct 4 ms 19548 KB Output is correct
22 Correct 4 ms 19764 KB Output is correct
23 Correct 4 ms 19752 KB Output is correct
24 Correct 4 ms 19548 KB Output is correct
25 Correct 4 ms 19548 KB Output is correct
26 Correct 4 ms 19548 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 90 ms 78676 KB Output is correct
2 Correct 90 ms 78800 KB Output is correct
3 Correct 86 ms 78836 KB Output is correct
4 Correct 106 ms 79444 KB Output is correct
5 Correct 62 ms 77272 KB Output is correct
6 Correct 61 ms 77064 KB Output is correct
7 Correct 63 ms 77268 KB Output is correct
8 Correct 60 ms 77136 KB Output is correct
9 Correct 162 ms 78268 KB Output is correct
10 Correct 69 ms 76264 KB Output is correct
11 Correct 60 ms 78020 KB Output is correct
12 Correct 59 ms 74696 KB Output is correct
13 Correct 66 ms 78612 KB Output is correct
14 Correct 67 ms 76356 KB Output is correct
15 Correct 89 ms 78568 KB Output is correct
16 Correct 78 ms 78672 KB Output is correct
17 Correct 63 ms 78416 KB Output is correct
18 Correct 63 ms 78164 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 92 ms 79444 KB Output is correct
2 Correct 95 ms 79368 KB Output is correct
3 Correct 149 ms 82840 KB Output is correct
4 Correct 96 ms 79396 KB Output is correct
5 Correct 621 ms 77908 KB Output is correct
6 Correct 546 ms 77904 KB Output is correct
7 Correct 65 ms 77792 KB Output is correct
8 Correct 432 ms 78052 KB Output is correct
9 Correct 163 ms 78204 KB Output is correct
10 Correct 130 ms 76908 KB Output is correct
11 Correct 130 ms 78536 KB Output is correct
12 Correct 153 ms 75464 KB Output is correct
13 Correct 276 ms 79272 KB Output is correct
14 Correct 561 ms 80888 KB Output is correct
15 Correct 741 ms 79476 KB Output is correct
16 Correct 696 ms 79572 KB Output is correct
17 Correct 677 ms 79436 KB Output is correct
18 Correct 700 ms 79108 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 670 ms 353796 KB Output is correct
2 Correct 614 ms 354640 KB Output is correct
3 Correct 840 ms 361548 KB Output is correct
4 Correct 603 ms 355048 KB Output is correct
5 Correct 1759 ms 346368 KB Output is correct
6 Correct 1536 ms 346044 KB Output is correct
7 Correct 333 ms 345940 KB Output is correct
8 Correct 1303 ms 346448 KB Output is correct
9 Correct 968 ms 346412 KB Output is correct
10 Correct 458 ms 346304 KB Output is correct
11 Correct 485 ms 345256 KB Output is correct
12 Correct 564 ms 346304 KB Output is correct
13 Correct 1132 ms 349352 KB Output is correct
14 Correct 2388 ms 355636 KB Output is correct
15 Correct 2268 ms 353820 KB Output is correct
16 Correct 2146 ms 353804 KB Output is correct
17 Correct 2054 ms 348672 KB Output is correct
18 Correct 2001 ms 349464 KB Output is correct