题目:http://www.sqyoj.club/problem.php?id=1022
分析:把数存入大根堆,也存入小根堆。
AC代码:
#include<cstdio>
#include<iostream>
using namespace std;
int n,m,x;
int maxheap[1500001],minheap[1500001];
int maxhsize,minhsize;
void swap(int &a,int &b){
int c=a;
a=b;
b=c;
}
void maxput(int x){
maxheap[++maxhsize]=x;
int now=maxhsize,nxt;
while(now>1){
nxt=now/2;
if(maxheap[nxt]>=maxheap[now])break;
swap(maxheap[nxt],maxheap[now]);
now=nxt;
}
}
int maxget(){
int tmp=maxheap[1];
maxheap[1]=maxheap[maxhsize--];
int now=1,nxt;
while(now*2<=maxhsize){
nxt=now*2;
if(nxt<maxhsize && maxheap[nxt+1]>maxheap[nxt])nxt++;
if(maxheap[now]>=maxheap[nxt])break;
swap(maxheap[nxt],maxheap[now]);
now=nxt;
}
return tmp;
}
void minput(int x){
minheap[++minhsize]=x;
int now=minhsize,nxt;
while(now>1){
nxt=now/2;
if(minheap[nxt]<=minheap[now])break;
swap(minheap[nxt],minheap[now]);
now=nxt;
}
}
int minget(){
int tmp=minheap[1];
minheap[1]=minheap[minhsize--];
int now=1,nxt;
while(now*2<=minhsize){
nxt=now*2;
if(nxt<minhsize && minheap[nxt+1]<minheap[nxt])nxt++;
if(minheap[now]<=minheap[nxt])break;
swap(minheap[nxt],minheap[now]);
now=nxt;
}
return tmp;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>m;
for(int j=1;j<=m;j++){
cin>>x;
maxput(x);minput(x);
}
cout<<minget()<<" "<<maxget()<<endl;
}
return 0;
}