題目描述
Black Box是一種原始的數據庫。它可以儲存一個整數數組,還有一個特別的變量i。最開始的時候Black Box是空的.而i等于0。這個Black Box要處理一串命令。
命令只有兩種:
ADD(x):把x元素放進BlackBox;
GET:i加1,然后輸出Blackhox中第i小的數。
記住:第i小的數,就是Black Box里的數的按從小到大的順序排序后的第i個元素。例如:
我們來演示一下一個有11個命令的命令串。(如下圖所示)
現在要求找出對于給定的命令串的最好的處理方法。ADD和GET命令分別最多200000個。現在用兩個整數數組來表示命令串:
1.A(1),A(2),…A(M):一串將要被放進Black Box的元素。每個數都是絕對值不超過2000000000的整數,M$200000。例如上面的例子就是A=(3,1,一4,2,8,-1000,2)。
2.u(1),u(2),…u(N):表示第u(j)個元素被放進了Blaek Box里后就出現一個GET命令。例如上面的例子中u=(l,2,6,6)。輸入數據不用判錯。
輸入輸出格式
輸入格式:
?
第一行,兩個整數,M,N。
第二行,M個整數,表示A(l)
……A(M)。
第三行,N個整數,表示u(l)
…u(N)。
?
輸出格式:
?
輸出Black Box根據命令串所得出的輸出串,一個數字一行。
?
輸入輸出樣例
7 4 3 1 -4 2 8-1000 2 1 2 6 6
3 3 1 2
說明
對于30%的數據,M≤10000;
對于50%的數據,M≤100000:
對于100%的數據,M≤200000。
?
因為他讓著輸出第i小的數,那么前i小的數是多少是無關緊要的
我們可以把前i小的數放到一個大根堆里面,當大根堆的值大于i的時候我們可以把它后面的放到小跟堆里面,
這樣就保證了小根堆的第一個一定是第i小的,
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<queue> 6 using namespace std; 7 const int MAXN=200001; 8 void read(int & n) 9 { 10 char c='+';int x=0;bool flag=0; 11 while(c<'0'||c>'9') 12 {c=getchar();if(c=='-')flag=1;} 13 while(c>='0'&&c<='9') 14 {x=x*10+(c-48);c=getchar();} 15 flag==1?n=-x:n=x; 16 } 17 priority_queue<int,vector<int> ,greater<int> >q; 18 priority_queue< int >p; 19 int now=0; 20 int a[MAXN]; 21 int b[MAXN]; 22 int pre; 23 int ls[MAXN]; 24 int num=0; 25 int main() 26 { 27 int n,m; 28 read(n);read(m); 29 for(int i=1;i<=n;i++) read(a[i]); 30 for(int i=1;i<=m;i++) read(b[i]); 31 pre=1; 32 for(int i=1;i<=n;i++) 33 { 34 p.push(a[i]); 35 if(p.size()>now) 36 { 37 q.push(p.top()); 38 p.pop(); 39 } 40 printf("%d***\n",q.size()); 41 printf("%d+++\n",p.size()); 42 while(i==b[pre]) 43 { 44 printf("%d\n",q.top()); 45 p.push(q.top()); 46 q.pop(); 47 pre++; 48 now++; 49 } 50 } 51 return 0; 52 }
?