제출 #1322234

#제출 시각아이디문제언어결과실행 시간메모리
1322234darlanfrancaExamination (JOI19_examination)C++20
2 / 100
3094 ms10848 KiB
#include <bits/stdc++.h> using namespace std; #define int long long using pii = pair<int,int>; const int MOD = 1e9 + 7; const int N = 2e5+10; const int B = 400; const int MAX_BLOCOS = N/B + 5; // problem link: https://oj.uz/problem/view/JOI19_examination struct Queries{ int x; int y; int z; int idx; bool operator<(const Queries &a) const { return x > a.x; } }; bool cmp(pii a, pii b){ return a.first > b.first; } class Sqrt{ private: vector<int> bloco[MAX_BLOCOS]; vector<pii> bloco_completo[MAX_BLOCOS]; public: void add(int b, int soma){ int idx_bloco = b/B; bloco_completo[idx_bloco].push_back({b,soma}); // agora eu quero inserir soma no vetor do bloco de deixar ordenado auto &vetor = bloco[idx_bloco]; auto it = upper_bound(vetor.begin(), vetor.end(), soma); // encontro o primeiro cara maior que soma; vetor.insert(it, soma); } int query(int y_idx, int z){ int total = 0; int idx_bloco = y_idx / B; for(auto &p : bloco_completo[idx_bloco]){ if(p.first >= y_idx && p.second >= z) total++; } for(int i = idx_bloco + 1; i < MAX_BLOCOS; i++){ auto &vetor = bloco[i]; if(vetor.empty()) continue; total += (vetor.end() - lower_bound(vetor.begin(), vetor.end(), z)); } return total; } }; signed main() { ios::sync_with_stdio(0); cin.tie(0); int n,q; cin >> n >> q; vector<pii> pares(n); vector<int> coord; for(int i=0;i<n;i++){ cin >> pares[i].first >> pares[i].second; coord.push_back(pares[i].second); } vector<Queries> queries(q); for(int i=0;i<q;i++){ cin >> queries[i].x >> queries[i].y >> queries[i].z; queries[i].idx = i; coord.push_back(queries[i].y); } sort(coord.begin(), coord.end()); coord.erase(unique(coord.begin(), coord.end()), coord.end()); auto get_idx = [&](int val) { return lower_bound(coord.begin(), coord.end(), val) - coord.begin(); }; sort(pares.begin(), pares.end(), cmp); sort(queries.begin(), queries.end()); Sqrt sq; vector<int> ans(q); int ptr = 0; for(int i=0;i<q;i++){ while(ptr < n && pares[ptr].first >= queries[i].x){ int b_comp = get_idx(pares[ptr].second); sq.add(b_comp, pares[ptr].first + pares[ptr].second); ptr++; } int y_comp = get_idx(queries[i].y); ans[queries[i].idx] = sq.query(y_comp, queries[i].z); } for(int i=0;i<q;i++){ cout << ans[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...