1 条题解
-
0
解题思路
为了方便我通过解释输入数据来解释题意。输入两个数M表示序列长度,N表示输入N个数表示当前序列插入了几位,例如n=1序列里插入了3,n=6序列里插入了3 1 -4 2 8 -1000,对于第i个输入的n输入当前插入的序列中第i小的数,也就是前i小的数中最大的数。
思路
使用两个优先队列,递减队列中存前i小的数,递增队列中存剩下的数。每次输入n,就先向递增队列中压入n个数,然后向递增队列转入i个,输出递增队列的top。 c++实现:
#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; }
- 1
信息
- ID
- 443
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 6
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者