제출 #1287873

#제출 시각아이디문제언어결과실행 시간메모리
1287873samarthkulkarniExamination (JOI19_examination)C++20
20 / 100
306 ms40980 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace std; using namespace __gnu_pbds; // #pragma GCC target ("avx2") // #pragma GCC optimize ("O3") // #pragma GCC optimize ("unroll-loops") // #pragma GCC optimize("fast-math") #define ll long long #define ld long double #define vi vector<ll> #define endl "\n" #define pr pair<ll, ll> #define ff first #define ss second #define all(x) x.begin(), x.end() const int mod = 1e9+7; void _p(ll a){cout<<a<<endl;} void _p(string a){cout<<a<<endl;} void _p(ld a) {cout<<a<<endl;} template <class T> void _p(vector<T> a){for(T val:a)cout<<val<<" ";cout<<endl;} #define debug(x) cout<<#x<<" -> ";_p(x) typedef tree<ll, null_type, less<ll>, rb_tree_tag, tree_order_statistics_node_update > ordered_set; vector<pr> move8 = {{1, 0}, {1, 1}, {0, 1}, {-1, 1}, {-1, 0}, {-1, -1}, {0, -1}, {1, -1}}; vector<pr> move4 = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}}; vector<pr> move2 = {{0, 1}, {1, 0}}; void solution(); int main() { ios::sync_with_stdio(false); cin.tie(nullptr); solution(); return 0; } struct Node { vi x; Node* left; Node* right; Node() {left = nullptr; right = nullptr;} }; struct WaveletTree{ ll n; vi a; vi idx; Node* root; WaveletTree(const vi &temp, ll mx) { n = mx; a = temp; idx.resize(a.size()); iota(all(idx), 0); root = new Node(); } Node* build(ll l, ll r, vi &curr) { Node* m = new Node(); m->x = curr; if (l == r) { return m; } ll mid = (l + r)/2; vi L, R; for (auto val : curr) { if (a[val] <= mid) L.push_back(val); else R.push_back(val); } m->left = build(l, mid, L); m->right = build(mid+1, r, R); return m; } ll binarySearch(vi& temp, ll l, ll r) { return upper_bound(all(temp), r) - upper_bound(all(temp), l-1); } ll query(Node* curr, ll l, ll r, ll L, ll R, ll c, ll d) { if (R < L) return 0; if (c > r || l > d) return 0; if (c <= l && d >= r) return binarySearch(curr->x, L, R); ll mid = (l + r)/2; ll a1 = query(curr->left, l, mid, L, R, c, d); ll a2 = query(curr->right, mid+1, r, L, R, c, d); return a1 + a2; } void build() {root = build(0, n, idx);} ll query(ll l, ll r, ll c, ll d) {return query(root, 0, n, l, r, c, d);} }; ll n, q; vector<array<ll, 3>> A; vector<array<ll, 3>> queries; vi temp; void solution() { cin >> n >> q; A.resize(n); for (int i = 0; i < n; i++) { cin >> A[i][0] >> A[i][1]; A[i][2] = A[i][0] + A[i][1]; temp.push_back(A[i][0]); temp.push_back(A[i][1]); temp.push_back(A[i][2]); } queries.resize(q); for (int i = 0; i < q; i++) { cin >> queries[i][0] >> queries[i][1] >> queries[i][2]; temp.push_back(queries[i][0]); temp.push_back(queries[i][1]); temp.push_back(queries[i][2]); } { sort(all(temp)); temp.erase(unique(all(temp)), temp.end()); auto comp = [&](ll k) {return lower_bound(all(temp),k) - temp.begin();}; for (int i = 0; i < n; i++) { A[i][0] = comp(A[i][0]); A[i][1] = comp(A[i][1]); A[i][2] = comp(A[i][2]); } for (int i = 0; i < q; i++) { queries[i][0] = comp(queries[i][0]); queries[i][1] = comp(queries[i][1]); queries[i][2] = comp(queries[i][2]); } } sort(all(A)); vi k1(n), k2(n); for (int i = 0; i < n; i++) { k1[i] = A[i][0]; k2[i] = A[i][1]; } ll mx = *max_element(all(k2)); WaveletTree M(k2, mx); M.build(); for (auto [a, b, c] : queries) { ll l = upper_bound(all(k1), a-1) - k1.begin(); if (l >= k1.size()) { cout << 0 << endl; } else { cout << M.query(l, n-1, b, mx+1) << endl; } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...