前言
之前用对顶堆做过,现在用 又做了一遍,到时候还会补发链表的做法
链接
http://poj.org/problem?id=3784
大意
输入 个数,要求第奇数次输入时,输出该序列的中位数
思路
我们可以用 中的 ,每次放入都自动排序,在利用迭代器找到其的中间元素
速度不是很快,比对顶堆慢多了,时间复杂度为:
代码
#include<algorithm>
#include<cstdio>
#include<set>
#define r(i,a,b) for(register int i=a;i<=b;i++)
using namespace std;int t,i,n,x,j;
inline int read()
{
int f=0,d=1;char c;
while(c=getchar(),c<48||c>57) if(c=='-') d=-1;f=(f<<3)+(f<<1)+c-48;
while(c=getchar(),c>47&&c<58) f=(f<<3)+(f<<1)+c-48;
return d*f;
}
inline void write(register int x)
{
if(x<0){x=-x;putchar('-');}
if(x>9)write(x/10);
putchar(x%10+48);
return;
}
signed main()
{
t=read();
multiset<int>st;
r(k,1,t)
{
st.clear();
i=read();n=read();
write(k);putchar(32);write((n+1)>>1);putchar(10);
x=read();
write(x);
st.insert(x);
for(i=2,j=1;i<=n;i++)
{
x=read();
st.insert(x);//放入
if(i&1)
{
if(j==10) putchar(10),j=0;else putchar(32);
multiset<int>::iterator be=st.begin();
multiset<int>::iterator ed=st.end();
ed--;//因为end位置上是空的,所以要往后移一格
for(;be!=ed;be++,ed--);//找到中间位置
printf("%d",*be);//输出
j++;
}
}
putchar(10);
}
}