标签:des style blog color os io strong ar for
| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 7436 | Accepted: 3050 |
Description
N Transaction i Black Box contents after transaction Answer
(elements are arranged by non-descending)
1 ADD(3) 0 3
2 GET 1 3 3
3 ADD(1) 1 1, 3
4 GET 2 1, 3 3
5 ADD(-4) 2 -4, 1, 3
6 ADD(2) 2 -4, 1, 2, 3
7 ADD(8) 2 -4, 1, 2, 3, 8
8 ADD(-1000) 2 -1000, -4, 1, 2, 3, 8
9 GET 3 -1000, -4, 1, 2, 3, 8 1
10 GET 4 -1000, -4, 1, 2, 3, 8 2
11 ADD(2) 4 -1000, -4, 1, 2, 2, 3, 8
Input
Output
Sample Input
7 4 3 1 -4 2 8 -1000 2 1 2 6 6
Sample Output
3 3 1 2
题意 :给出n,m,然后接下一行输入n个数,最后一行输入m个数,要求对于最后一行的第i个数,输出在原数列中前x个数中第i小的数,。好绕口,然后一开始用sort是各种TLE,好多大神用平衡树过的,差点没吓哭我,然后,。。撸了两个堆,一个最大堆,一个最小堆,注意维护好这两个堆,其中最大堆放前k个最小的数,最小堆放剩余的数,那么最大堆的堆顶就是第k个最小的数。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cctype>
#include <cstdlib>
#include <algorithm>
#include <set>
#include <vector>
#include <string>
#include <map>
#include <queue>
using namespace std;
const int maxn= 30010;
int a[maxn];
priority_queue <int,vector<int>,less<int> > maxQ;
priority_queue <int,vector<int>,greater<int> > minQ;
int main()
{
int n,m,x;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
int pos=0;
for(int i=1;i<=m;i++)
{
scanf("%d",&x);
while(pos<x)
minQ.push(a[pos++]);//新加元素放入最小堆
while(maxQ.size()<i)//维护最大堆
{
maxQ.push(minQ.top());
minQ.pop();
}
while(!minQ.empty()&&maxQ.top()>minQ.top())//维护两个堆,严格保证maxQ.top()<=minQ.top()
{
int t1=maxQ.top(),t2=minQ.top();
maxQ.pop();minQ.pop();
maxQ.push(t2);minQ.push(t1);
}
printf("%d\n",maxQ.top());
}
return 0;
}标签:des style blog color os io strong ar for
原文地址:http://blog.csdn.net/qq_16255321/article/details/39009005