Submission #1351250

#TimeUsernameProblemLanguageResultExecution timeMemory
1351250mamabearInspections (NOI23_inspections)C++20
0 / 100
5 ms15940 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>

using namespace std;

typedef long long ll;

const int MAXN = 1e6 + 5;
int tree[4 * MAXN];

vector<pair<ll, ll>> sorted_gaps;
map<ll, ll> gap_map;

void update_and_harvest(int node, int start, int end, int l, int r, int task_idx, 
                        const vector<int>& task_r, const vector<ll>& task_start_days) {
    
    if (tree[node] != -1) {
        if (tree[node] > 0) {
            int prev_task = tree[node];
            ll L = task_start_days[task_idx - 1] - task_start_days[prev_task];
            ll final_gap = (ll)task_r[prev_task - 1] - l + L;
            
            gap_map[final_gap] += (min(end, r) - max(start, l) + 1);
        }
        if (start >= l && end <= r) {
            tree[node] = task_idx;
            return;
        }
    }

    int mid = (start + end) / 2;
    if (tree[node] != -1) {
        tree[2 * node] = tree[2 * node + 1] = tree[node];
        tree[node] = -1;
    }

    if (l <= mid) update_and_harvest(2 * node, start, mid, l, r, task_idx, task_r, task_start_days);
    if (r > mid) update_and_harvest(2 * node + 1, mid + 1, end, l, r, task_idx, task_r, task_start_days);
    
    if (tree[2 * node] == tree[2 * node + 1] && tree[2 * node] != -1) {
        tree[node] = tree[2 * node];
    } else {
        tree[node] = -1;
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    int n, m, q;
    if (!(cin >> n >> m >> q)) return 0;

    vector<int> task_l(m), task_r(m);
    vector<ll> task_start_days(m + 1, 0);

    for (int i = 0; i < m; ++i) {
        cin >> task_l[i] >> task_r[i];
        task_start_days[i + 1] = task_start_days[i] + (task_r[i] - task_l[i] + 1);
    }

    fill(tree, tree + 4 * MAXN, 0);

    for (int i = 0; i < m; ++i) {
        update_and_harvest(1, 1, n, task_l[i], task_r[i], i + 1, task_r, task_start_days);
    }

    for (auto const& [size, count] : gap_map) {
        sorted_gaps.push_back({size, count});
    }

    vector<ll> suffix_sum(sorted_gaps.size() + 1, 0);
    for (int i = (int)sorted_gaps.size() - 1; i >= 0; --i) {
        suffix_sum[i] = suffix_sum[i + 1] + sorted_gaps[i].second;
    }

    for (int i = 0; i < q; ++i) {
        ll s;
        cin >> s;
        
        auto it = lower_bound(sorted_gaps.begin(), sorted_gaps.end(), make_pair(s, -1LL));
        int idx = distance(sorted_gaps.begin(), it);
        
        cout << suffix_sum[idx] << (i == q - 1 ? "" : " ");
    }
    cout << endl;

    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...