Submission #836917

#TimeUsernameProblemLanguageResultExecution timeMemory
836917borisAngelovExamination (JOI19_examination)C++17
100 / 100
540 ms35852 KiB
#include <bits/stdc++.h> using namespace std; const int maxn = 600005; const int max_number = 600000; int n, q; struct element { int x; int y; int z; bool is_query; int query_idx; element() { } element(int _x, int _y, int _z, bool _is_query, int _query_idx) { x = _x; y = _y; z = _z; is_query = _is_query; query_idx = _query_idx; } }; element a[maxn]; void compress() { vector<int> to_sort; unordered_map<int, int> compressed; int curr_value = 0; for (int i = 1; i <= n + q; ++i) { to_sort.push_back(a[i].x); to_sort.push_back(a[i].y); to_sort.push_back(a[i].z); } sort(to_sort.begin(), to_sort.end()); for (int i = 0; i < to_sort.size(); ++i) { if (i == 0 || to_sort[i] != to_sort[i - 1]) { compressed[to_sort[i]] = ++curr_value; } } for (int i = 1; i <= n + q; ++i) { a[i].x = compressed[a[i].x]; a[i].y = compressed[a[i].y]; a[i].z = compressed[a[i].z]; } } int answers[maxn]; struct fenwick_tree { int tree[maxn]; void update(int pos, int delta) { for (int i = pos; i <= max_number; i += (i & (-i))) { tree[i] += delta; } } int query(int pos) { int result = 0; for (int i = pos; i >= 1; i -= (i & (-i))) { result += tree[i]; } return result; } }; fenwick_tree bit; void divide_and_conquer(int l, int r) { if (l == r) { return; } int mid = (l + r) / 2; vector<element> active; for (int i = l; i <= mid; ++i) { if (a[i].is_query == false) { active.push_back(element(0, a[i].y, a[i].z, false, 0)); } } for (int i = mid + 1; i <= r; ++i) { if (a[i].is_query == true) { active.push_back(element(0, a[i].y, a[i].z, true, a[i].query_idx)); } } sort(active.begin(), active.end(), [&](element fr, element sc) { return make_pair(fr.y, -fr.is_query) > make_pair(sc.y, -sc.is_query); }); vector<int> pos_to_clear; for (int i = 0; i < active.size(); ++i) { if (active[i].is_query == false) { bit.update(active[i].z, +1); pos_to_clear.push_back(active[i].z); } else { answers[active[i].query_idx] += (bit.query(max_number) - bit.query(active[i].z - 1)); } } for (int i = 0; i < pos_to_clear.size(); ++i) { bit.update(pos_to_clear[i], -1); } divide_and_conquer(l, mid); divide_and_conquer(mid + 1, r); } void fastIO() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); } int main() { fastIO(); cin >> n >> q; for (int i = 1; i <= n; ++i) { cin >> a[i].x >> a[i].y; a[i].z = a[i].x + a[i].y; } for (int i = 1; i <= q; ++i) { cin >> a[i + n].x >> a[i + n].y >> a[i + n].z; a[i + n].is_query = true; a[i + n].query_idx = i; } compress(); sort(a + 1, a + n + q + 1, [&](element fr, element sc) { return make_pair(fr.x, -fr.is_query) > make_pair(sc.x, -sc.is_query); }); divide_and_conquer(1, n + q); for (int i = 1; i <= q; ++i) { cout << answers[i] << "\n"; } return 0; } /* 5 4 35 100 70 70 45 15 80 40 20 95 20 50 0 10 10 0 60 60 0 0 100 0 5 4 35 100 70 70 45 15 80 40 20 95 20 50 120 10 10 100 60 60 80 0 100 100 */

Compilation message (stderr)

examination.cpp: In function 'void compress()':
examination.cpp:50:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   50 |     for (int i = 0; i < to_sort.size(); ++i)
      |                     ~~^~~~~~~~~~~~~~~~
examination.cpp: In function 'void divide_and_conquer(int, int)':
examination.cpp:129:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<element>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  129 |     for (int i = 0; i < active.size(); ++i)
      |                     ~~^~~~~~~~~~~~~~~
examination.cpp:142:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  142 |     for (int i = 0; i < pos_to_clear.size(); ++i)
      |                     ~~^~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...