poj-1442 Black Box
2015-08-21 15:15
218 查看
题意:为了方便我通过解释输入数据来解释题意。输入两个数M表示序列长度,N表示输入N个数表示当前序列插入了几位,例如n=1序列里插入了3,n=6序列里插入了3 1 -4 2 8 -1000,对于第i个输入的n输入当前插入的序列中第i小的数,也就是前i小的数中最大的数。
思路:使用两个优先队列,递减队列中存前i小的数,递增队列中存剩下的数。每次输入n,就先向递增队列中压入n个数,然后向递增队列转入i个,输出递增队列的top。
思路:使用两个优先队列,递减队列中存前i小的数,递增队列中存剩下的数。每次输入n,就先向递增队列中压入n个数,然后向递增队列转入i个,输出递增队列的top。
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <cstdlib> #include <queue> #define INF 0x3f3f3f3f #define mod 1000000007 using namespace std; int arr[35000]; int main() { int n,m,x; int i,j,k; while(~scanf("%d%d",&n,&m)) { queue<int>a; priority_queue<int,vector<int>,greater<int> >Q; priority_queue<int,vector<int>,less<int> >P; for(i=1;i<=n;i++) { scanf("%d",&arr[i]); } j=1;k=0; for(i=1;i<=m;i++) { scanf("%d",&x); if(x==k) j--; //k作为检查x是否重复输入的工具,如果重复需要重新进入下面的循环所以j--; for(;j<=x;j++) { if(x!=k) Q.push(arr[j]); if(P.size()<i) { P.push(Q.top()); Q.pop(); } else if (P.size()==i) { if(Q.top()<P.top()) { Q.push(P.top()); P.pop(); P.push(Q.top()); Q.pop(); } } if(x==j) a.push(P.top()); } k=x; //k的赋值 } while(!a.empty()) { printf("%d\n",a.front()); a.pop(); } } return 0; }
相关文章推荐
- Foreach用法
- 程序员的生活充满压力,但你不能放弃!
- intellj(idea) 编译项目时在warnings 页签框里 报 “xxx包不存在” 或 “找不到符号” 或 “未结束的字符串字面值” 或 “需要)” 或 “需要;”等错误提示
- hdu 5299 树上博弈
- android中判断是否为空遇到的问题
- hdu5407
- 系统架构 很喜欢所以转发了
- 访问控制(public .private .protected )
- 二叉查找各类情况总结
- Android zygote分析——学习笔记
- U-boot-2014.04移植到MINI2440(1) 初步探索移植
- Android组件之间的通信方式
- LeetCode题解:Valid Sudoku
- hdu5407
- HDU 5407 CRB and Candies(数学 素数表+预处理+快速幂+乘法逆元)——多校练习10
- Http session cookie
- ios8 tableView设置滑动删除时显示多个按钮
- KeyEvent 键码值
- 有一种感动叫ACM(记WJMZBMR在成都赛区开幕式上的讲话)
- Note For Linux By Jes(3)-Linux文件与目录管理