想学treap的,结果发现这题用堆也能做。
用堆的写法:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <stack>
#include <algorithm>
#include <cmath>
#include <map>
#define LL long long
#define DB double
using namespace std;
priority_queue<int> quemx,quemi;
const int N = 30009;
const int INF = ~0u>>1;
int A[N];
int n,m;
int v[N];
int main()
{
scanf("%d%d",&n,&m);
int a;
for(int i=1; i<=n; i++) scanf("%d",&A[i]);
for(int i=0; i<m; i++)
{
scanf("%d",&a);
v[a]++;
}
int c=1;
for(int i=1; i<=n; i++)
{
quemx.push(A[i]);
while((int)quemx.size()>c)
{
int t = quemx.top();
quemx.pop();
quemi.push(-t);
}
while(v[i])
{
int tmp = quemx.top();
printf("%d\n",tmp);
c++;
if(!quemi.empty())
tmp = -quemi.top(),quemi.pop(),quemx.push(tmp);
v[i]--;
}
}
return 0;
}
不会treap。。