【multiset】POJ 3784 Running Median【补充】

前言

之前用对顶堆做过,现在用 m u l t i s e t 又做了一遍,到时候还会补发链表的做法

链接

http://poj.org/problem?id=3784

大意

输入 n 个数,要求第奇数次输入时,输出该序列的中位数

思路

我们可以用 S T L 中的 m u l t i s e t ,每次放入都自动排序,在利用迭代器找到其的中间元素

速度不是很快,比对顶堆慢多了,时间复杂度为:

O ( n 2 × ( l o g n + l o g n 2 ) = O ( n 2 × l o g 2 n 3 )

代码

#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);
    }
}

猜你喜欢

转载自blog.csdn.net/xuxiayang/article/details/81742106
今日推荐