HDU5249(set+queue模拟)

来源:互联网 发布:硕士论文修改 淘宝 编辑:程序博客网 时间:2024/05/23 01:57

这种动态查询中位数的题目比较老了。。。我在这篇博客的最后面也讲到了 点击我

原理是一样的,只不过把堆改成了set,因为要删除元素再加一个queue记录进入顺序。

我这里用比较简练的方式实现了。

        #include<iostream>        #include<set>        #include<queue>        #include<algorithm>        #include<cstdio>        using namespace std;int main(){    int Case=1;    int n;    while(cin>>n)    {    printf("Case #%d:\n",Case++);    char s[20];    queue<int> q;    set<int> left;    set<int> right;    int total=0;    for(int i=1;i<=n;i++)    {    scanf("%s",s);        if(s[0]=='i')        {        int num;        scanf("%d",&num);        q.push(num);        if(total==0||num<*left.rbegin())        left.insert(num);else    right.insert(num);        total++;    }    else if(s[0]=='o')    {    int num=q.front();    q.pop();    total--;    if(left.find(num)!=left.end())    left.erase(num);elseright.erase(num);}elseprintf("%d\n",*left.rbegin());//调整左右高度if(total!=0&&total%2==0&&left.size()==right.size()){left.insert(*right.begin());right.erase(*right.begin());}else if(total%2==1&&left.size()-right.size()>2){right.insert(*left.rbegin());left.erase(*left.rbegin());}    }}} 



原创粉丝点击