D-猫猫与主人_牛客小白月赛71 (nowcoder.com)
警钟敲烂,一眼题写半天
#include<bits/stdc++.h>
using namespace std;
int a[200010];//猫的友善
int b[200010];//猫的期待友善
struct node
{
int c,d;//人的友善,人的期待友善,首先a>=d,然后二分x,找最大的c
}x[200010];
bool com(node x,node y)
{
return x.d<y.d;
}
int lg[200010];
int s[200010][29];
void init_(int m)
{
for(int i=1;i<=m;i++)
{
s[i][0]=x[i].c;
}
for(int i=1;(1<<i)<=m;i++)
{
for(int j=1;j+(1<<(i-1))<=m;j++)
{
s[j][i] = max(s[j][i-1],s[j+(1<<(i-1))][i-1]);
}
}
}
void get(int m)
{
lg[1]=0;
for(int i=2;i<=m;i++)
{
lg[i]=lg[i/2]+1;
}
}
int main()
{
ios::sync_with_stdio(false);
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=n;i++)
{
cin>>b[i];
}
for(int i=1;i<=m;i++)
{
cin>>x[i].c;
}
for(int i=1;i<=m;i++)
{
cin>>x[i].d;
}
sort(x+1,x+1+m,com);
init_(m);
get(m);
for(int i=1;i<=n;i++)
{
int l1=1,r1=m;
int ans=-1;
while(l1<r1)
{
int mid = (l1+r1-1)/2 + 1;
if(x[mid].d>a[i])
{
r1 = mid - 1;
}else
{
l1 = mid;
}
}
if(x[l1].d<=a[i])
{
int L=l1;
int k = lg[L];
ans = max(s[1][k],s[l1-(1<<k)+1][k]);
if(ans<b[i]) ans = -1;
}
cout<<ans<<" ";
}
return 0;
}