Submission #1247831

#TimeUsernameProblemLanguageResultExecution timeMemory
1247831wenbangInspections (NOI23_inspections)C++20
100 / 100
345 ms29820 KiB
#include <iostream> #include <map> #include <vector> #ifdef LOCAL #include "print.h" #else template <typename... Args> inline void print(const Args&... args) {} inline void newline() {} #endif using ll = long long; #define endl '\n' #define FOR(i, n) for (int i = 0; i < n; i++) using namespace std; static const ll INF = (1LL << 60); signed main() { ios::sync_with_stdio(0); cin.tie(0); #ifdef LOCAL freopen("input.txt", "r", stdin); #endif int n, m, q; cin >> n >> m >> q; vector<int> l(m + 1), r(m + 1); for (int i = 1; i <= m; i++) { cin >> l [i] >> r [i]; } vector<ll> pref(m + 1, 0); for (int i = 1; i <= m; i++) { ll len = r [i] - l [i] + 1; pref [i] = pref [i - 1] + len; } vector<ll> offset(m + 1, 0); for (int i = 1; i <= m; i++) { offset [i] = pref [i - 1] - (l [i] - 1); } // start: {end, last task} map<int, pair<int, int>> lastRun; lastRun [1] = {n, 0}; auto split = [&](int x) { if (x > n) { return lastRun.end(); } auto it = lastRun.upper_bound(x); it--; int start = it->first; int end = it->second.first; int last = it->second.second; if (start == x) { return it; } if (end < x) { return next(it); } lastRun.erase(it); lastRun [start] = {x - 1, last}; lastRun [x] = {end, last}; return lastRun.find(x); }; vector<pair<ll, ll>> events; events.reserve(m * 2); for (int j = 1; j <= m; j++) { int left = l [j], right = r [j]; auto itR = split(right + 1); auto itL = split(left); for (auto it = itL; it != itR; ++it) { int start = it->first; int end = it->second.first; int last = it->second.second; if (last != 0) { ll weight = end - start + 1; ll g = offset [j] - offset [last] - 1; events.emplace_back(g, weight); } } lastRun.erase(itL, itR); lastRun [left] = {right, j}; } sort(events.begin(), events.end(), [&](auto& a, auto& b) { return a.first < b.first; }); int numEvents = events.size(); vector<ll> suffix(numEvents + 1, 0); for (int i = numEvents - 1; i >= 0; i--) { suffix [i] = suffix [i + 1] + events [i].second; } vector<ll> ans(q); FOR(i, q) { ll s; cin >> s; int ind = lower_bound( events.begin(), events.end(), pair<ll, ll>(s, -INF), [&](auto& a, auto& b) { return a.first < b.first; } ) - events.begin(); cout << suffix [ind] << (i + 1 < q ? ' ' : '\n'); } }
#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...