P10237 [yLCPC2024] E. Latent Kindom 题解
P10237 [yLCPC2024] E. Latent Kindom 题解
简单的单
解法
考虑把每个序列
考虑将两个序列
当前
考虑如何移动二分的
复杂度分析:排序复杂度
在排序时这里有个小 trick,就是在
代码
#include<bits/stdc++.h>
namespace fast_IO
{
/**
* 快读快写
*/
};
using namespace fast_IO;
#define int long long
int t,n,q,len[1000010];
std::vector<int> v[1000010];
inline int check(int x,int y,int lx,int ly)
{
int midi=std::max(v[x][lx],v[y][ly]);
if(midi<=v[x][lx+1] && midi<=v[y][ly+1]) return 1;
if(midi>v[x][lx+1]) return 0;
return 2;
}
signed main()
{
in>>t;
while(t--)
{
in>>n>>q;
for(int i=1,x;i<=n;i++)
{
in>>len[i],v[i].clear(),v[i].push_back(-1),v[i].push_back(0x7fffffffffffffff);
for(int j=1;j<=len[i];j++) in>>x,v[i].push_back(x);
std::sort(v[i].begin(),v[i].end());
}
for(int i=1,tlen,x,y,l,r,mid,ret,ans;i<=q;i++)
{
in>>x>>y,tlen=len[x]+len[y],tlen=ceil(tlen/2.0);
l=std::max(0ll,tlen-len[y]),r=std::min(len[x],tlen);
while(l<=r)
{
mid=(l+r)/2,ret=check(x,y,mid,tlen-mid);
if(ret==1)
{
ans=std::max(v[x][mid],v[y][tlen-mid]);
break;
}else if(ret==0) l=mid+1;
else r=mid-1;
}
out<<ans<<'\n';
}
}
fwrite(Ouf,1,p3-Ouf,stdout),fflush(stdout);
return 0;
}