8340 2024. 01. 14 19:23:10 anon Tanúk (45 pont) cpp17 Elfogadva 45/45 120ms 20224 KiB
#include <bits/stdc++.h>
#define all(x) (x).begin(), (x).end()
#define FastIO ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL)
using namespace std;
typedef long long ll;
int main() {
    FastIO;
    bool flag;
    ll i, j, mh, N, H, K;
    cin >> N >> H >> K;
    vector<ll> tss(K);
    vector<array<ll, 2>> guests(N);
    for(i = 0; i < K; i++)
        cin >> tss[i];
    for(i = 0; i < N; i++)
        cin >> guests[i][0] >> guests[i][1];
    sort(all(tss));
    vector<array<vector<ll>, 2>> eps(H + 1);
    for(i = 0; i < N; i++) {
        for(j = 0; j < 2; j++)
            eps[guests[i][j]][j].push_back(i);
    }
    unordered_set<ll> here;
    vector<bool> bad_guests(N, false);
    if(N <= 80000) {
        fill(all(bad_guests), true);
        j = 0;
        for(i = 1; i <= H && j < K; i++) {
            for(const auto &x : eps[i][0])
                here.insert(x);
            if(i == tss[j]) {
                for(const auto &x : here)
                    bad_guests[x] = false;
                j++;
            }
            for(const auto &x : eps[i][1])
                here.erase(x);
        }
        here.clear();
    }
    unordered_set<ll> lc;
    vector<ll> ans;
    j = 0;
    for(i = 1; i <= H; i++) {
        for(const auto &x : eps[i][0]) {
            if(!bad_guests[x])
                here.insert(x);
        }
        if(j < K && i == tss[j]) {
            if(ans.empty())
                lc = here;
            else {
                for(const auto &x : here) {
                    if(guests[ans.back()][1] < guests[x][0])
                        lc.insert(x);
                }
            }
            j++;
        }
        flag = !lc.empty();
        if(flag) {
            flag = false;
            for(const auto &x : eps[i][1]) {
                if(lc.find(x) != lc.end()) {
                    flag = true;
                    break;
                }
            }
        }
        if(flag) {
            mh = *(here.begin());
            for(const auto &x : here) {
                if(guests[mh][1] < guests[x][1])
                    mh = x;
            }
            ans.push_back(mh);
            j = upper_bound(all(tss), guests[mh][1]) - tss.begin();
            lc.clear();
        }
        for(const auto &x : eps[i][1]) {
            if(!bad_guests[x])
                here.erase(x);
        }
    }
    cout << ans.size() << '\n';
    for(const auto &x : ans)
        cout << x + 1 << ' ';
    cout << '\n';
    return 0;
}
Részfeladat Összpont Teszt Verdikt Idő Memória
base 45/45
1 Elfogadva 0/0 3ms 1824 KiB
2 Elfogadva 0/0 43ms 12484 KiB
3 Elfogadva 2/2 32ms 12444 KiB
4 Elfogadva 2/2 3ms 3040 KiB
5 Elfogadva 2/2 3ms 2608 KiB
6 Elfogadva 2/2 4ms 3260 KiB
7 Elfogadva 2/2 4ms 3356 KiB
8 Elfogadva 2/2 4ms 3304 KiB
9 Elfogadva 2/2 6ms 7196 KiB
10 Elfogadva 2/2 4ms 4680 KiB
11 Elfogadva 2/2 7ms 7768 KiB
12 Elfogadva 2/2 8ms 8168 KiB
13 Elfogadva 2/2 9ms 8252 KiB
14 Elfogadva 2/2 8ms 5848 KiB
15 Elfogadva 2/2 13ms 6364 KiB
16 Elfogadva 2/2 13ms 9728 KiB
17 Elfogadva 2/2 54ms 14632 KiB
18 Elfogadva 2/2 71ms 17836 KiB
19 Elfogadva 2/2 74ms 15408 KiB
20 Elfogadva 2/2 82ms 15740 KiB
21 Elfogadva 2/2 72ms 19040 KiB
22 Elfogadva 2/2 86ms 19428 KiB
23 Elfogadva 2/2 72ms 19532 KiB
24 Elfogadva 3/3 120ms 20224 KiB