abc 241 D.Sequence Query
阿新 • • 發佈:2022-03-13
Sequence Query
題意:
插入元素,查詢不小於x的第k個元素和查詢不大於x的第k個元素
思路:
使用multiset來寫,排序複雜度為nlogn
注意這裡的upper和lower,也可以直接用se.lower_bound()來表示或者upper_bound()來表示,迭代器用auto
upper時找到大於x的第一個元素座標為it,然後範圍是[ it-k,it-1 ],所以這裡it先--
所以第一種情況我們需要限制 **it **的範圍
而lower_bound找到的是大於等於x的第一個元素,查詢區間範圍是[ it,it+k]所以it++可以留在後手,而迴圈的i其實不影響 都用[ 0,k)
#include<bits/stdc++.h> using namespace std; typedef multiset<long long > IntSet; IntSet se; signed main() { int q; cin>>q; long long n,x,k; for(int i=1;i<=q;i++) { cin>>n>>x; if(n==1) { se.insert(x); } else if(n==2) { cin>>k; int cnt=0; auto it = se.upper_bound(x); if(it==se.begin()) //這裡一定要千萬注意!!!先限制範圍 { cout<<-1<<endl; continue; } for(int i=0;i<k;i++) { it--; //先手 if(it==se.begin()&&i!=k-1) { cout<<-1<<endl; break; } else if(i==k-1) { cout<<*it<<endl; break; } } } else if(n==3) { cin>>k; auto it = se.lower_bound(x); for(int i=0;i<=k-1;i++) { if(it==se.end()) { cout<<-1<<endl; break; } else if(i==k-1) { cout<<*it<<endl; } it++; //後手 } } } }