제출 #120228

#제출 시각아이디문제언어결과실행 시간메모리
120228oolimryExamination (JOI19_examination)C++14
43 / 100
3038 ms148888 KiB
#include <bits/stdc++.h> using namespace std; typedef pair<int,int> ii; struct query{ int x, y, z, id; }; bool comp(query a, query b){ return a.z > b.z; } bool comp2(ii a, ii b){ return a.first + a.second > b.first + b.second; } class SegmentTree{ public: int n; unordered_map<int,int> tree; void create(int nn){ n = nn; } void update(int i){ i += n; while(i > 0){ tree[i]++; i >>= 1; } } int query(int l, int r){ int ans = 0; for(l += n,r += n;l < r;l >>= 1, r >>= 1){ if(l & 1){ ans += tree[l]; l++; } if(r & 1){ r--; ans += tree[r]; } } return ans; } }; int main() { //freopen("i.txt","r",stdin); ios_base::sync_with_stdio(false); cin.tie(0); int n, m; cin >> n >> m; ii arr[n]; for(int i = 0;i < n;i++){ cin >> arr[i].first >> arr[i].second; } query queries[m]; for(int i = 0;i < m;i++){ int x, y, z; cin >> x >> y >> z; z = max(z, x + y); query q; q.z = z; q.y = y; q.x = x; q.id = i; queries[i] = q; } sort(queries,queries+m,comp); sort(arr,arr+n,comp2); SegmentTree x; SegmentTree y; x.create(1000000005); y.create(1000000005); int ans[m]; int c = 0; for(int i = 0;i < m;i++){ //cout << queries[i].z << ": "; while(true){ if(c == n) break; if(arr[c].first + arr[c].second < queries[i].z) break; //cout << arr[c].first << " " << arr[c].second << "|"; x.update(arr[c].first); y.update(arr[c].second); c++; } ans[queries[i].id] = c - x.query(0,queries[i].x) - y.query(0,queries[i].y); //cout << "\n"; } for(int i = 0;i < m;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...