UOJ 52 元旦激光炮

http://uoj.ac/problem/52

题意:每次可以得到3个序列中

思路:每次分别取出三个序列的K/3长度的位置,取最小的那个,然后每次减掉它,总复杂度是Nlog3N

#include "kth.h"
#include<algorithm>
int C[2000005];
int query_kth(int n_a, int n_b, int n_c, int k)
{   
    
       
    int Len=k;
    int la=0,lb=0,lc=0;
    int ans=0;
    while (Len>3){
        int va=2147483647,vb=2147483647,vc=2147483647;
        int lena=std::min(Len/3,n_a-la+1);
        int lenb=std::min(Len/3,n_b-lb+1);
        int lenc=std::min(Len/3,n_c-lc+1);
        if (lena>=1) va=get_a(la+lena-1);
        if (lenb>=1) vb=get_b(lb+lenb-1);
        if (lenc>=1) vc=get_c(lc+lenc-1);
        if (va<=vb&&va<=vc){
           la+=lena;
           Len-=lena;
           ans=std::max(ans,va);
        }else
        if (vb<=va&&vb<=vc){
           lb+=lenb;
           Len-=lenb;
           ans=std::max(ans,vb);
        }else
        if (vc<=va&&vc<=vb){
           lc+=lenc;
           Len-=lenc;
           ans=std::max(ans,vc);
        }
    }
    int cnt=0;
    int lena=std::min(Len,n_a-la+1);
    int lenb=std::min(Len,n_b-lb+1);
    int lenc=std::min(Len,n_c-lc+1);    
    for (int i=1;i<=lena;i++)
        C[++cnt]=get_a(la+i-1);
    for (int i=1;i<=lenb;i++)
        C[++cnt]=get_b(lb+i-1);
    for (int i=1;i<=lenc;i++)
        C[++cnt]=get_c(lc+i-1);
    std::sort(C+1,C+1+cnt);
    for (int i=1;i<=Len;i++)
        ans=std::max(ans,C[i]);
    
    return ans;
    
}

 

posted @ 2016-07-20 21:34  GFY  阅读(287)  评论(0编辑  收藏  举报