题目分析:
第一次做交互题目,心情复杂。
我们只需要编写一个函数来实现题目上需要就OK了。
CE 5 次是真的骚。
WA 1 次更骚了
al,bl,cl
为 a,b,c 中分别排名为
[⌊k3⌋]
的数
假设
al
最小那么
al
最极端的情况下应该是3l-2小的,并不到k
然后我们把a中前l的元素去掉 相对于的 我们也要查询 k-l大的值了
这样不停的搞下去,直到我们需要查询的 k <3 即可
这样最多有 6 个元素,直接排序 找 即可
效率问题:
每一次 k 减小
[⌊k3⌋]
也就是上次的
[⌊2∗k3⌋]
总的查询次数也就是
3∗log1.5k+6
最极限的数据下也就调用99次,可以AC
Ac Code:
#include "kth.h"
#include <vector>
#include <algorithm>
std::vector<int>ans;
int min(int x,int y)
{
if(x<y) return x;
return y;
}
int query_kth(int na,int nb,int nc,int k)
{
ans.clear();
int al=0,bl=0,cl=0;
while(k>=3)
{
int l=k/3;
int nowa=get_a(al+l-1),nowb=get_b(bl+l-1),nowc=get_c(cl+l-1);
int minn=min(nowa,min(nowb,nowc));
if(minn==nowa) al+=l;
else if(minn==nowb) bl+=l;
else if(minn==nowc) cl+=l;//刚开始忘了特判有相同元素的了,然后就被Hack数据卡掉了
k-=l;
}
for(int i=1;i<=k;i++)
{
if(al<na) ans.push_back(get_a(al++));
if(bl<nb) ans.push_back(get_b(bl++));
if(cl<nc) ans.push_back(get_c(cl++));
}
std::sort(ans.begin(),ans.end());
return ans[k-1];
}