Submission #216332

#TimeUsernameProblemLanguageResultExecution timeMemory
216332DystoriaXExamination (JOI19_examination)C++14
100 / 100
833 ms42212 KiB
#include <bits/stdc++.h> using namespace std; const int MAX = 200010; struct BIT{ vector<int> bit; int query(int x){ int ret = 0; for(; x; x -= x & (-x)) ret += bit[x]; return ret; } void update(int x, int val){ for(; x < MAX; x += x & (-x)) bit[x] += val; } BIT(){ bit.assign(MAX, 0); } void init(){ bit.assign(MAX, 0); } } bitX, bitY; struct Query{ int x, y, z, idx; bool spec = false; }; int n, q; map<int, int> c[3]; vector<int> cp[3]; vector<Query> pt, qr; int ans[MAX]; void Compress(){ for(int i = 0; i < 3; i++){ sort(cp[i].begin(), cp[i].end()); cp[i].erase(unique(cp[i].begin(), cp[i].end()), cp[i].end()); int j = 1; for(auto k : cp[i]) c[i][k] = j++; } for(auto &k : pt){ k.x = c[0][k.x]; k.y = c[1][k.y]; k.z = c[2][k.z]; } for(auto &k : qr){ k.x = c[0][k.x]; k.y = c[1][k.y]; k.z = c[2][k.z]; } } bool compQ(Query a, Query b){ return a.z > b.z; } bool compQx(Query a, Query b){ return a.x > b.x; } int main(){ scanf("%d%d", &n, &q); pt.resize(n), qr.resize(q); for(int i = 0; i < n; i++){ scanf("%d%d", &pt[i].x, &pt[i].y); pt[i].z = pt[i].x + pt[i].y; cp[0].emplace_back(pt[i].x); cp[1].emplace_back(pt[i].y); cp[2].emplace_back(pt[i].z); } for(int i = 0; i < q; i++){ scanf("%d%d%d", &qr[i].x, &qr[i].y, &qr[i].z); cp[0].emplace_back(qr[i].x); cp[1].emplace_back(qr[i].y); cp[2].emplace_back(qr[i].z); qr[i].idx = i; qr[i].spec = (qr[i].x + qr[i].y < qr[i].z); } Compress(); sort(pt.begin(), pt.end(), compQ); sort(qr.begin(), qr.end(), compQ); int id = 0; for(auto &k : qr){ // cout << "Processing " << k.idx << endl; while(id < n && pt[id].z >= k.z){ bitX.update(pt[id].x, 1); bitY.update(pt[id].y, 1); id++; // cout << "Added " << pt[id - 1].x << " " << pt[id - 1].y << endl; } //Derived from validX + validY - totalValid if(k.spec) ans[k.idx] = id - bitX.query(k.x - 1) - bitY.query(k.y - 1); } sort(pt.begin(), pt.end(), compQx); sort(qr.begin(), qr.end(), compQx); bitY.init(); id = 0; for(auto &k : qr){ if(k.spec) continue; while(id < n && pt[id].x >= k.x){ bitY.update(pt[id].y, 1); id++; } ans[k.idx] = id - bitY.query(k.y - 1); } for(int i = 0; i < q; i++) printf("%d\n", ans[i]); return 0; }

Compilation message (stderr)

examination.cpp: In function 'int main()':
examination.cpp:73:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d%d", &n, &q);
     ~~~~~^~~~~~~~~~~~~~~~
examination.cpp:78:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d%d", &pt[i].x, &pt[i].y);
         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
examination.cpp:87:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d%d%d", &qr[i].x, &qr[i].y, &qr[i].z);
         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...