結果
問題 |
No.3085 Easy Problems
|
ユーザー |
|
提出日時 | 2025-02-07 11:21:40 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 761 ms / 2,000 ms |
コード長 | 1,167 bytes |
コンパイル時間 | 3,757 ms |
コンパイル使用メモリ | 283,660 KB |
実行使用メモリ | 10,112 KB |
最終ジャッジ日時 | 2025-04-04 20:36:40 |
合計ジャッジ時間 | 28,118 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 31 |
ソースコード
#include<bits/stdc++.h> using namespace std; int main(){ int N,Q; cin >> N; vector<int> A(N),B(N); vector<vector<int>> c(100001,vector<int>(0));//分野別に問題を入れる配列 for(int i = 0; i < N; i++){ cin >> A[i] >> B[i]; c[B[i]].push_back(A[i]); } for(int i = 0; i <= 100000; i++){ sort(c[i].begin(),c[i].end()); } sort(A.begin(),A.end());//ソート cin >> Q; for(int i = 0; i < Q; i++){ int X,Y; cin >> X >> Y; int ans = 0; int ok = -1, ng = N;//少なくともok番目まではX以下,少なくともng番目からはXより大きい while(abs(ok - ng) > 1){//まずAで二分探索をする int mid = (ok + ng) / 2; if(A[mid] <= X)ok = mid; else ng = mid; } ans = ok + 1; ok = -1, ng = c[Y].size(); while(abs(ok - ng) > 1){//次に分野Yだけの配列で二分探索をする int mid = (ok + ng) / 2; if(c[Y][mid] <= X)ok = mid; else ng = mid; } ans -= ok + 1; cout << ans << endl; } return 0; }