HDU_5249(百度之星D题)
2015-05-31 23:47
190 查看
因为之前没写过平衡树的题,所以很自然地只会用set来写。。。然后,很蠢地想直接找set容器中间位置的那个值,结果iterator没有重载+唉。。。翻了一下AC的代码(果然有跟我一样用set来写的),然后发现是两个set容器解决了这个问题。。。其实很容易想到,一个set容器放前一半的数,一个set容器放后一半的数,就行了。。。
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <cstdlib> #include <set> #include <queue> #define FOR(i,x,y) for(int i = x;i < y;i ++) #define IFOR(i,x,y) for(int i = x;i > y;i --) using namespace std; int n; int main() { //freopen("test.in","r",stdin); int tCase = 0; while(~scanf("%d",&n)){ printf("Case #%d:\n",++tCase); int num; queue <int> s; set <int> p,q; char str[10]; while(n--){ getchar(); scanf("%s",str); if(str[0] == 'q'){ printf("%d\n",*(q.begin())); } else if(str[0] == 'i'){ scanf("%d",&num); s.push(num); if(q.empty() || num < *(q.begin())){ p.insert(num); } else q.insert(num); } else{ int v = s.front(); s.pop(); if(p.find(v) != p.end()){ p.erase(v); } else q.erase(v); } while(p.size() > q.size()){ set <int> :: iterator it = p.end(); it--; int v = *it; p.erase(it); q.insert(v); } while(q.size() > p.size()+1){ set <int> :: iterator it = q.begin(); int v = *it; p.insert(v); q.erase(it); } } } return 0; }
相关文章推荐
- 有了SQLService的基础,轻松学习Oracle
- 测试计划
- kb-07线段树-12--二分查找区间边界
- C++中调用开源库路径问题
- hdu 1022 Train Problem I (栈的应用)
- SRS文档
- 第一次接触MVC Models概念
- ubuntu配置JDK
- 导航条的设计与实现
- 深入理解java多线程中的join()
- 用文件的读写和string作为临时存储区复制图片文件
- 关于如何修改weblogic用户密码的问题
- php中一个完整表单处理实现代码
- SRS文档
- 数据库设计(2)_逻辑结构设计
- 如何编译openwrt
- 浅谈委托和事件(一)
- 浮动与定位
- HDU 2047
- Bitnami WordPress如何让默认URL指向WordPress目录?