黑匣子
题目链接:https://www.luogu.com.cn/problem/P1801
题意:
略
思路:
需要在一个变化(元素不断增加)的数组 快速查找第i小的元素
考虑使用对顶堆
即分别开一个大根堆和一个小根堆
如果要求第几大的元素即让小根堆元素相对大,大根堆元素相对小
如果要求第几小的元素即让大根堆元素相对大,小根堆元素相对小
根据操作不断向后遍历数组并维护对顶堆即可
时间复杂度O(nlogn)
void solve(){
int m,n;cin>>m>>n;
vector<int>a(m+1);
vector<int>u(n+1);
rep(i,1,m)cin>>a[i];
rep(i,1,n)cin>>u[i];
priority_queue<int,vector<int>,greater<int>>qmin;
priority_queue<int>qmax;
int now=1;
int p=1;
while(p<=n){
for(int i=now;i<=u[p];i++){
if(qmax.empty()||qmax.top()>a[i])qmax.push(a[i]);
else qmin.push(a[i]);
}
while(qmax.size()>p){
qmin.push(qmax.top());
qmax.pop();
}
while(qmax.size()<p&&qmin.size()){
qmax.push(qmin.top());
qmin.pop();
}
now=u[p]+1;
p++;
cout<<qmax.top()<<endl;
}
}

浙公网安备 33010602011771号