做过中位数那题你会发现,这题两个堆就能维护了
查看原帖
做过中位数那题你会发现,这题两个堆就能维护了
1169915
miku010123楼主2024/9/5 20:56
#include<bits/stdc++.h>
using namespace std;
#define int long long 

void solve()
{
    int n,m,cnt=0;
    priority_queue<int,vector<int>,less<int>>q1;//存取前面的数
    priority_queue<int,vector<int>,greater<int>>q2;//存取后面的数
    unordered_map<int,int>um;
    cin>>m>>n;
    vector<int>a(m+1);
    for(int i=1;i<=m;i++)
    {
        cin>>a[i];
    }
    for(int i=1;i<=n;i++)
    {
        int x;
        cin>>x;
        um[x]++;
    }
    for(int i=1;i<=m;i++)
    {
        if(q1.empty()||q1.top()>=a[i])
        {
            q1.push(a[i]);
        }
        else 
        {
            q2.push(a[i]);
        }
        if(um.count(i))
        {
            int x=um[i];
            while(x--)
            {
                cnt++;
                if(q1.size()>cnt)
                {
                    while(q1.size()>cnt)
                    {
                        q2.push(q1.top());
                        q1.pop();
                    }
                }
                else if(q1.size()<cnt)
                {
                    while(q1.size()<cnt)
                    {
                        q1.push(q2.top());
                        q2.pop();
                    }
                }
                cout<<q1.top()<<'\n';
            }
        }
    }
}

signed main()
{
    solve();
}
2024/9/5 20:56
加载中...