Submission #383921

#TimeUsernameProblemLanguageResultExecution timeMemory
383921nikatamlianiExamination (JOI19_examination)C++14
100 / 100
806 ms59036 KiB
#include <bits/stdc++.h> using namespace std; const int N = 3e5+10; template <typename T> struct fenwick_tree { int size; vector<T> tree; T neutral; fenwick_tree(int n, T _neutral) { size = n; neutral = _neutral; tree = vector<T>(n + 1); } void update(int index, T value) { for(; index <= size; index += index & -index) { tree[index] += value; } } T query_prefix(int index) { T ans = neutral; for(; index; index -= index & -index) { ans += tree[index]; } return ans; } T query(int l, int r) { return query_prefix(r) - query_prefix(l - 1); } }; map<int, int> compress(vector<int> &coords) { sort(coords.begin(), coords.end()); map<int, int> compressed; for(int i = 0, current = 0; i < (int)coords.size(); ++i) { if(i == 0 || coords[i] != coords[i - 1]) ++current; compressed[coords[i]] = current; } return compressed; } int x[N], y[N], a[N], b[N], c[N]; int main() { ios::sync_with_stdio(0); cin.tie(0); int n, m; cin >> n >> m; vector<vector<int>> v; vector<int> sorted_sums; for(int i = 1; i <= n; ++i) { cin >> x[i] >> y[i]; sorted_sums.push_back(x[i] + y[i]); v.push_back({x[i], y[i]}); } sort(sorted_sums.begin(), sorted_sums.end()); sort(v.begin(), v.end()); for(int i = 1; i <= n; ++i) { x[i] = v[i - 1][0]; y[i] = v[i - 1][1]; } v.clear(); for(int i = 1; i <= m; ++i) { cin >> a[i] >> b[i] >> c[i]; } vector<int> type1, type2; for(int i = 1; i <= m; ++i) { if(a[i] + b[i] >= c[i]) { type1.push_back(i); } else { type2.push_back(i); } } map<int, int> compressed_sum, compressed_x, compressed_y; //sum vector<int> coords(n + m); for(int i = 1; i <= m; ++i) { coords[i - 1] = c[i]; } for(int i = 1; i <= n; ++i) { coords[i + m - 1] = x[i] + y[i]; } compressed_sum = compress(coords); //x for(int i = 1; i <= m; ++i) { coords[i - 1] = a[i]; } for(int i = 1; i <= n; ++i) { coords[i + m - 1] = x[i]; } compressed_x = compress(coords); //y for(int i = 1; i <= m; ++i) { coords[i - 1] = b[i]; } for(int i = 1; i <= n; ++i) { coords[i + m - 1] = y[i]; } compressed_y = compress(coords); sort(type1.begin(), type1.end(), [&](int x, int y) { if(a[x] == a[y]) { if(b[x] == b[y]) { return c[x] < c[y]; } return b[x] < b[y]; } return a[x] < a[y]; }); auto sum = [](int x, int y) -> int { return x + y; }; fenwick_tree<int> t(N, 0); fenwick_tree<int> tx(N, 0); fenwick_tree<int> ty(N, 0); vector<int> ans(m+1); for(int i = (int)type1.size() - 1, j = n; i >= 0; --i) { int q_id = type1[i]; while(j > 0 && x[j] >= a[q_id]) { int val = compressed_y[y[j]]; t.update(val, 1); --j; } int val = compressed_y[b[q_id]]; ans[q_id] = t.query(val, t.size); } for(int i : type2) { int l = 0, r = n - 1, ind = n; while(r >= l) { int middle = l + r >> 1; if(sorted_sums[middle] >= c[i]) { r = middle - 1; ind = middle; } else { l = middle + 1; } } ans[i] = n - ind; } vector<int> sums[N], queries[N]; for(int i = 1; i <= n; ++i) { int val = compressed_sum[x[i] + y[i]]; sums[val].push_back(i); } for(int i : type2) { if(i == -1) continue; int val = compressed_sum[c[i]]; queries[val].push_back(i); } int max_sum_val = (int)compressed_sum.size(); for(int i = max_sum_val; i >= 1; --i) { for(int id : sums[i]) { int val_x = compressed_x[x[id]]; int val_y = compressed_y[y[id]]; tx.update(val_x, 1); ty.update(val_y, 1); } for(int id : queries[i]) { int val_x = compressed_x[a[id]]; int val_y = compressed_y[b[id]]; ans[id] -= tx.query(1, val_x - 1); ans[id] -= ty.query(1, val_y - 1); } } for(int i = 1; i <= m; ++i) { cout << ans[i] << '\n'; } }

Compilation message (stderr)

examination.cpp: In function 'int main()':
examination.cpp:125:19: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  125 |    int middle = l + r >> 1;
      |                 ~~^~~
examination.cpp:105:7: warning: variable 'sum' set but not used [-Wunused-but-set-variable]
  105 |  auto sum = [](int x, int y) -> int {
      |       ^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...