• 【洛谷P1801】黑匣子【堆】


    题目大意 :

    题目链接:https://www.luogu.org/problemnew/show/P1801
    两种操作:

    • ADD(x)ADD(x):加入xx元素
    • GETGET:第iiGETGET操作输出第ii小的元素

    思路:

    有点像对顶堆啊。
    每次维护一个大根堆,保证只保存最小的ss个数字。其中ss表示现在进行了ssGETGET操作。
    然后维护一个小根堆,把其他所有数字储存进去。这样每次询问完就可以把不在大根堆里的最小的元素扔进大根堆里。方便下一次询问。
    时间复杂度O(mlogn)O(mlog n)


    代码:

    #include <queue>
    #include <cstdio>
    using namespace std;
    
    const int N=200010;
    int n,m,s,add[N],cnt[N];
    priority_queue<int> q1,q2;
    
    int main()
    {
    	scanf("%d%d",&n,&m);
    	for (int i=1;i<=n;i++)
    		scanf("%d",&add[i]);
    	for (int i=1;i<=m;i++)
    	{
    		int x;
    		scanf("%d",&x);
    		cnt[x]++;
    	}
    	for (int i=1;i<=n;i++)
    	{
    		q1.push(add[i]);
    		while (q1.size()>s)
    		{
    			q2.push(-q1.top());
    			q1.pop();
    		}
    		for (;cnt[i];cnt[i]--)
    		{
    			s++;
    			q1.push(-q2.top());
    			q2.pop();
    			printf("%d
    ",q1.top());
    		}
    	}
    	return 0;
    }
    
  • 相关阅读:
    集合
    3/11
    字典
    3/10
    字符串之不常用方法
    字符串的索引和切片
    数据类型的转化
    Markdown在线编辑器
    3/9
    Django:RestFramework之-------渲染器
  • 原文地址:https://www.cnblogs.com/hello-tomorrow/p/11998163.html
Copyright © 2020-2023  润新知