Submission #1286755

#TimeUsernameProblemLanguageResultExecution timeMemory
1286755tdd209Fire (BOI24_fire)C++20
0 / 100
1 ms576 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define fti(i, x, y) for (int i = x; i <= y; ++i)
#define F first
#define S second

int n, m, res = 0, lg;
pair <int, int> t[200005];
int s[200005], e[200005], up[200005][20];
int tree[800005];

void zip()
{
    vector <int> z;
    z.push_back(m);
    fti(i, 1, n)
        z.push_back(t[i].F), z.push_back(t[i].S);
    z.push_back(1e9 + 7);
    sort(z.begin(), z.end());
    z.erase(unique(z.begin(), z.end()), z.end());
    m = lower_bound(z.begin(), z.end(), m) - z.begin();
    fti(i, 1, n)
    {
        t[i].F = lower_bound(z.begin(), z.end(), t[i].F) - z.begin();
        t[i].S = lower_bound(z.begin(), z.end(), t[i].S) - z.begin();
    }
}

//
int get(int x, int y)
{
    return (t[x].S < t[y].S ? y : x);
}

void build(int nd = 1, int l = 1, int r = n)
{
    if (l == r)
    {
        tree[nd] = l; return;
    }
    int c = (l + r) >> 1, p1 = nd << 1, p2 = p1 | 1;
    build(p1, l, c); build(p2, c + 1, r);
    tree[nd] = get(tree[p1], tree[p2]);
}

int query(int L, int R, int nd = 1, int l = 1, int r = n)
{
    if (r < L || R < l) return 0;
    if (L <= l && r <= R) return tree[nd];
    int c = (l + r) >> 1, p1 = nd << 1, p2 = p1 | 1;
    return get(query(L, R, p1, l, c), query(L, R, p2, c + 1, r));
}

bool ok[51];

void suf1()
{
    int msk = (1 << n) - 1;
    fti(mask, 1, msk)
    {
        bool chek = 1;
        fti(i, 0, m) ok[i] = 0;
        fti(i, 1, n)
            if ((mask >> (i - 1)) & 1)
            {
                fti(u, t[i].F, min(t[i].S, m)) ok[u] = 1;
            }
        fti(i, 0, m)
            if (!ok[i])
            {
                chek = 0; break;
            }
        if (chek) res = min(res, __builtin_popcount(mask));
    }
    cout << (res > n ? -1 : res);
}

void sus2()
{
    build();
    fti(i, 1, n)
    {
        pair <int, int> nxt = {t[i].S + 1, 0};
        int pos = lower_bound(t + 1, t + n + 1, nxt) - t - 1;
        up[i][0] = query(1, pos);
    }
    lg = __lg(n);
    fti(j, 1, lg)
        fti(i, 1, n)
            up[i][j] = up[up[i][j - 1]][j - 1];
}

int main()
{
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    cin >> n >> m;
    fti(i, 1, n)
    {
        cin >> t[i].F >> t[i].S;
        if (t[i].F > t[i].S) t[i].S += m;
    }
    sort(t + 1, t + 1 + n);
    res = n + 1;
    int mock = t[1].F;
    m -= mock;
    fti(i, 1, n)
    {
        t[i].F -= mock, t[i].S -= mock;
    }
    zip();
    if (n <= 20)
        suf1();
    else
        sus2();
    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...