百度首页 | 百度空间
 
查看文章
 
ecnu 2149 华丽的队列 堆? ^_^ STL 真的很好很强大
2008-06-10 22:59
http://202.120.80.191/problem.php?problemid=2149

比赛还剩最后一个小时的时候,只有三题可做(剩下的全巨变态)。后来选择了B,因为发现可以回溯。当时看这题被数据量吓到了,想了想堆,怕写错。没敢下手。今晚重做这题,仔细想了想,原来可以用stl里的map轻松实现。 ^_^

PS:这题写完后连续4个 Runtime Error,后来sunny_fable (神 ) 手出了一个数据就把我程序挂了。一调试,发现是我的删除操作只做了2个while,改为while(1),竟然过了,时间也不是太慢。:-)
STL真的很强大。 map 可以当堆用,而且比较priority_queue的最大优点是:可以删除特定元素(先find,再erase) 。

贴下丑陋的代码:
#include <cstdio>
#include <cstring>
#include <cassert>
#include <map>
#include <queue>
using namespace std;

struct Node{
    int value, time;
    Node(){};
    Node( int v, int t):value(v),time(t){};
};

map<int, int> mmp;
queue<Node> mq;
int N, t;
char order[20];

void solve(){
    scanf("%s", order);
    Node node;
    map<int,int>::iterator mit;
    int x;
    if( strcmp(order,"insert")==0 ){
        scanf("%d", &x);
        mq.push(Node(x, ++t) );
        mmp.insert( make_pair(x,t) );
        printf("%d\n", mmp.size() );
    }
    else if( strcmp(order, "delete")==0 ){
        int tv, tt;
        node=mq.front();
        mit =mmp.find(node.value);
        while(1){
            node=mq.front();
            mit=mmp.find(node.value);
            if( mit==mmp.end()){
                mq.pop();
                node=mq.front();
                mit=mmp.find(node.value);
            }
            else{
                tt=mit->second;
                if( tt==node.time){
                    printf("%d\n", node.value);
                    break;
                }
                if( tt!=node.time){
                    mq.pop();
                    node=mq.front();
                }
            }
        }
        mq.pop();
        mmp.erase(mit);
    }
    else{
        printf("%d\n", mmp.begin()->first );
        mmp.erase(mmp.begin());
    }
}

int main(){
    scanf("%d", &N);
    t=0;
    while( N--){
        solve();
    }
    return 0;
}

类别:Stl | 添加到搜藏 | 浏览() | 评论 (1)
 
最近读者:
 
网友评论:
1
2008-06-11 17:42
这题数据有问题,害我搞了好久
 
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码:
 

     

©2008 Baidu