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

 

转载于:https://www.cnblogs.com/qzqzgfy/p/5689800.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值