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; }
原文:http://blog.csdn.net/qq_16255321/article/details/39009005