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