[P1801]黑匣子

来源:互联网 发布:mysql skipnetworking 编辑:程序博客网 时间:2024/05/09 13:31

原题链接

思路来自题解

使用两个堆来维护
大根堆
记录当前
前s个最小的数

多出来的数
扔到小根堆里
等需要输出的时候
把小根堆的顶
输出
然后删掉
放进大根堆里

#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<cmath>#include<algorithm>#include<queue>#include<vector>using namespace std;priority_queue<int>a;//大根堆 priority_queue<int>b;//小根堆 int m,n,num[200000+5],u[200000+5],i,s,k,ans;int main(){    scanf("%d%d",&m,&n);    for(i=1;i<=m;i++)        scanf("%d",&num[i]);            for(i=1;i<=n;i++)        scanf("%d",&u[i]);    s=0;    k=1;    for(i=1;i<=m;i++)    {        a.push(num[i]);        if(a.size()>s)        {            b.push(-a.top());            a.pop();                    }         while(u[k]==i)        {            s++;                        ans=-b.top();            a.push(ans);            b.pop();            printf("%d\n",ans);            k++;        }    }    return 0;   }
0 0
原创粉丝点击