查看文章 |
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; } |
最近读者: