Submission #1316344

#TimeUsernameProblemLanguageResultExecution timeMemory
1316344wangzhiyi33Examination (JOI19_examination)C++20
100 / 100
371 ms22272 KiB
#include <bits/stdc++.h> using namespace std; struct BIT2D { int n; vector<vector<int>> ys; vector<vector<int>> bit; BIT2D(int n): n(n), ys(n+1), bit(n+1) {} void fake_update(int x, int y) { for (; x <= n; x += x & -x) ys[x].push_back(y); } void build() { for (int i = 1; i <= n; i++) { sort(ys[i].begin(), ys[i].end()); ys[i].erase(unique(ys[i].begin(), ys[i].end()), ys[i].end()); bit[i].assign(ys[i].size() + 1, 0); } } void add(int x, int y, int v) { for (; x <= n; x += x & -x) { int yy = lower_bound(ys[x].begin(), ys[x].end(), y) - ys[x].begin() + 1; for (; yy < (int)bit[x].size(); yy += yy & -yy) bit[x][yy] += v; } } int sum(int x, int y) { int res = 0; for (; x > 0; x -= x & -x) { int yy = upper_bound(ys[x].begin(), ys[x].end(), y) - ys[x].begin(); for (; yy > 0; yy -= yy & -yy) res += bit[x][yy]; } return res; } }; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N, Q; cin >> N >> Q; vector<int> S(N), T(N); for (int i = 0; i < N; i++) cin >> S[i] >> T[i]; struct Query { int A, B, C, id; }; vector<Query> queries(Q); for (int i = 0; i < Q; i++) { cin >> queries[i].A >> queries[i].B >> queries[i].C; queries[i].id = i; } // Prepare points vector<array<int,3>> students(N); vector<int> allU, allV; for (int i = 0; i < N; i++) { int u = T[i]; int v = S[i] + T[i]; students[i] = {S[i], u, v}; allU.push_back(u); allV.push_back(v); } // Compress U and V sort(allU.begin(), allU.end()); allU.erase(unique(allU.begin(), allU.end()), allU.end()); sort(allV.begin(), allV.end()); allV.erase(unique(allV.begin(), allV.end()), allV.end()); auto getU = [&](int x) { return int(lower_bound(allU.begin(), allU.end(), x) - allU.begin()) + 1; }; auto getV = [&](int x) { return int(lower_bound(allV.begin(), allV.end(), x) - allV.begin()) + 1; }; for (auto &s : students) { s[1] = getU(s[1]); s[2] = getV(s[2]); } // Sort students by S descending sort(students.begin(), students.end(), [](auto &a, auto &b) { return a[0] > b[0]; }); // Prepare BIT BIT2D bit(allU.size()); // Fake updates to build structure for (auto &s : students) bit.fake_update(s[1], s[2]); bit.build(); // Sort queries by A descending sort(queries.begin(), queries.end(), [](auto &a, auto &b) { return a.A > b.A; }); vector<int> answer(Q); int ptr = 0; for (auto &q : queries) { while (ptr < N && students[ptr][0] >= q.A) { bit.add(students[ptr][1], students[ptr][2], 1); ptr++; } int uB = lower_bound(allU.begin(), allU.end(), q.B) - allU.begin(); int vC = lower_bound(allV.begin(), allV.end(), q.C) - allV.begin(); int total = bit.sum(allU.size(), allV.size()); int lessU = bit.sum(uB, allV.size()); int lessV = bit.sum(allU.size(), vC); int lessUV = bit.sum(uB, vC); answer[q.id] = total - lessU - lessV + lessUV; } for (int i = 0; i < Q; i++) cout << answer[i] << '\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...