洛谷 P7072 [CSP-J2020] 直播获奖

当年比赛不会STL

手写堆确实麻烦

复制代码
#include<bits/stdc++.h>
using namespace std;

#define N 100005

int n , k ;
int a[N];
int maxn[205];
int heap[N] , len ;
int ans [N] ;
int cnt ;
void put (int x)
{
    int now ;
    heap[++len] = x ;
    now = len ;
    while(now > 1)
    {
        int net = now >> 1;
        if(heap[net] <= heap[now]) break;
        swap(heap[net] , heap[now]);
        now = net; 
    }
}
void get()
{
    int now ;
    heap [1] = heap[len--];
    now = 1;
    while( (now<<1) <= len)
    {
        int net = now << 1;
        if(net < len && heap[net+1] < heap[net]) ++net;
        if(heap [net] >= heap[now] ) break;
        swap(heap[net] , heap[now]);
        now = net;
    }
}
int find()
{
    return heap [1];
}
int main()
{
    //freopen("live.in","r",stdin);
    //freopen("live.out","w",stdout);
    scanf("%d%d", &n , &k) ;
    int t = 0 ;
    for(int  i= 1 ; i<= n ;++i)
    {
        scanf("%d" , &a[i]);    
        int s  =  max(1, (i * k) / 100);
        if(s > t )
        {
            if(a[i] >= maxn[1] ) put(a[i]);
            else 
            {
                put(maxn[1]);
                for(int j= 1; j<= 200 ; ++j)
                {
                   if(a[i] > maxn[j+1] )
                   {
                        maxn[j] = a[i];
                        break;
                   }
                   maxn[j] = maxn[j+1];
                }
            }
        }
        else
        {
            if(a[i] > find() ) 
            {
                for(int j = 200 ; j >= 2 ;--j)
                     maxn[j] = maxn[j-1];
                maxn[1] = find();
                get() ; 
                put(a[i]) ;
            }
            else
            {
                for(int j = 1; j <= 200 ; ++j )
                {
                     if(a[i] > maxn[j])
                     {
                         for(int q = 200 ; q >= j + 1 ; --q )
                            maxn[q] = maxn [ q - 1] ;
                         maxn[j] = a[i] ; 
                         break;
                     }
                }
            }
        }
        t = s;
        ans[++cnt] = find();
    }
    for(int i= 1;i<= cnt; ++i)
        printf("%d%c",ans[i],i==cnt ? '\n' : ' ');
    return 0;
}
复制代码

 

posted @   LikC1606  阅读(211)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示