Submission #926966

#TimeUsernameProblemLanguageResultExecution timeMemory
926966gubshigExamination (JOI19_examination)C++17
20 / 100
152 ms6088 KiB
#include <bits/stdc++.h> using namespace std; constexpr int MX = 1e5 + 1e3; struct BIT{ int t[MX], sz = MX; BIT(){ fill(t, t + MX, 0); } void update(int i, int v){ while(i < MX){ t[i] += v; i += (i & -i); } } int query(int i){ int ret = 0; while(i){ ret += t[i]; i -= (i & -i); } return ret; } }; int n, q, ans[MX]; bool flag[MX]; array<int, 3> s[MX]; array<int, 4> qs[MX]; void solvex(){ sort(s + 1, s + 1 + n, [&](array<int, 3> a, array<int, 3> b){ return a[0] > b[0]; }); sort(qs + 1, qs + 1 + q, [&](array<int, 4> a, array<int, 4> b){ return a[0] > b[0]; }); BIT bit; int ptr = 1; for(int i = 1; i <= q; i++){ while(ptr <= n && s[ptr][0] >= qs[i][0]){ bit.update(s[ptr][2], 1); ptr++; } if(flag[qs[i][3]]) ans[qs[i][3]] += ptr - bit.query(qs[i][2] - 1) - 1; } } void solvey(){ sort(s + 1, s + 1 + n, [&](array<int, 3> a, array<int, 3> b){ return a[1] > b[1]; }); sort(qs + 1, qs + 1 + q, [&](array<int, 4> a, array<int, 4> b){ return a[1] > b[1]; }); BIT bit, bitx; int ptr = 1; for(int i = 1; i <= q; i++){ while(ptr <= n && s[ptr][1] >= qs[i][1]){ bit.update(s[ptr][2], 1); bitx.update(s[ptr][0], 1); ptr++; } if(flag[qs[i][3]]) ans[qs[i][3]] += ptr - bit.query(qs[i][2] - 1) - 1; else ans[qs[i][3]] = ptr - bitx.query(qs[i][0] - 1) - 1; } } void solvez(){ for(int i = 1; i <= q; i++){ if(flag[qs[i][3]]) ans[qs[i][3]] -= n - qs[i][2] + 1; } } int main(){ cin.tie(nullptr)->sync_with_stdio(0); cin >> n >> q; vector<int> a, c; for(int i = 1; i <= n; i++){ cin >> s[i][0] >> s[i][1]; a.push_back(s[i][0]); c.push_back(s[i][0] + s[i][1]); } sort(a.begin(), a.end()); a.resize(unique(a.begin(), a.end()) - a.begin()); sort(c.begin(), c.end()); c.resize(unique(c.begin(), c.end()) - c.begin()); for(int i = 1; i <= n; i++){ s[i][2] = lower_bound(c.begin(), c.end(), s[i][0] + s[i][1]) - c.begin() + 1; s[i][0] = lower_bound(a.begin(), a.end(), s[i][0]) - a.begin() + 1; } for(int i = 1; i <= q; i++){ cin >> qs[i][0] >> qs[i][1] >> qs[i][2]; flag[i] = qs[i][0] + qs[i][1] < qs[i][2]; qs[i][0] = lower_bound(a.begin(), a.end(), qs[i][0]) - a.begin() + 1; qs[i][2] = lower_bound(c.begin(), c.end(), qs[i][2]) - c.begin() + 1; qs[i][3] = i; } solvex(); solvey(); solvez(); for(int i = 1; i <= q; i++){ cout << ans[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...