码迷,mamicode.com
首页 > 其他好文 > 详细

UOJ 52 元旦激光炮

时间:2016-07-20 23:03:36      阅读:220      评论:0      收藏:0      [点我收藏+]

标签:

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;
    
}

 

UOJ 52 元旦激光炮

标签:

原文地址:http://www.cnblogs.com/qzqzgfy/p/5689800.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!