Submission #1282074

#TimeUsernameProblemLanguageResultExecution timeMemory
1282074peanutExamination (JOI19_examination)C++20
43 / 100
393 ms29968 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; using pii = pair<ll, ll>; #define all(x) (x).begin(), (x).end() #define sz(x) (int)(x).size() #define fi first #define se second #define pb push_back #define eb emplace_back #define mp make_pair int dx[] = {0, 0, 1, -1}; int dy[] = {1, -1, 0, 0}; template<class X, class Y> bool maximize (X &x, const Y &y) {return x < y ? x = y, 1 : 0;} template<class X, class Y> bool minimize (X &x, const Y &y) {return x > y ? x = y, 1 : 0;} const int maxn = 1e5 + 5; const int MOD = 1e9 + 7; const int INF = 0x3f3f3f3f; struct query {int x, y, z, id;}; struct info {int comp_x, orig_x, orig_y;}; int n, q; info a[maxn]; query queries[maxn]; int nx; vector<int> pos[maxn]; vector<int> BIT[maxn]; void fakeupd(int x, int y) { for (; x <= nx; x += x & (-x)) pos[x].pb(y); } void fakeget(int x, int y) { for (; x; x -= x & (-x)) pos[x].pb(y); } void compress() { for (int i = 1; i <= nx; ++i) { if (pos[i].empty()) continue; pos[i].pb(INT_MIN); sort(all(pos[i])); pos[i].erase(unique(all(pos[i])), pos[i].end()); BIT[i].assign(sz(pos[i]) + 5, 0); } } int getidx(int x, int y) { return lower_bound(all(pos[x]), y) - pos[x].begin() + 1; } void realupd(int x, int y, int val) { for (int i = x; i <= nx; i += i & (-i)) for (int j = getidx(i, y); j <= sz(pos[i]); j += j & (-j)) BIT[i][j] += val; } int realget(int x, int y) { int res = 0; for (int i = x; i > 0; i -= i & (-i)) for (int j = getidx(i, y); j > 0; j -= j & (-j)) res += BIT[i][j]; return res; } int main() { ios::sync_with_stdio(false); cin.tie(0); //freopen(".INP", "r", stdin); //freopen(".OUT", "w", stdout); cin >> n >> q; vector<int> comp; for (int i = 1; i <= n; ++i) { cin >> a[i].orig_x >> a[i].orig_y; comp.pb(a[i].orig_x); } for (int i = 1; i <= q; ++i) { cin >> queries[i].x >> queries[i].y >> queries[i].z; comp.pb(queries[i].x); queries[i].id = i-1; } sort(a+1, a+1+n, [](info &a, info &b) {return a.orig_x + a.orig_y > b.orig_x + b.orig_y;}); sort(queries+1, queries+1+q, [](query &a, query &b) {return a.z > b.z;}); sort(all(comp)); comp.erase(unique(all(comp)), comp.end()); nx = sz(comp); for (int i = 1; i <= n; ++i) { a[i].comp_x = lower_bound(all(comp), a[i].orig_x) - comp.begin() + 1; fakeupd(nx - a[i].comp_x + 1, -a[i].orig_y); } for (int i = 1; i <= q; ++i) { queries[i].x = lower_bound(all(comp), queries[i].x) - comp.begin() + 1; fakeget(nx - queries[i].x + 1, -queries[i].y); } compress(); vector<int> ans(q); int idx = 1; for (int i = 1; i <= q; ++i) { while (idx <= n && a[idx].orig_x + a[idx].orig_y >= queries[i].z) { realupd(nx - a[idx].comp_x + 1, -a[idx].orig_y, 1); ++idx; } ans[queries[i].id] = realget(nx - queries[i].x + 1, -queries[i].y); } for (auto i : ans) cout << i << '\n'; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...