猫猫与主人
思路:用两个结构体保存,c表示猫,r表示主人,同时对c按照a从小到大排序,对r按照d从小到大排序,从小到大枚举猫,并且我们用l来表示从1~l的所有的人满足c.a>=r.d,因为c.a时逐渐变大的,所以l也是逐渐变大的,那么对于某一个i来说,如果此时1~l满足c.a>=r.d,那么我们只需要找到1~l中最大的b,如果前缀中最大的b不满足r.b>=c.c那么代表没有答案就是-1,否则因为这是满足条件的最大的,所以直接等于r.b,而前缀中最大的数,我们可以通过预处理得到
#include<bits/stdc++.h>
#define fi first
#define se second
using namespace std;
const int N=2e5+7;
typedef pair<int,int> PII;
int n,m;
int maxn[N];
int ans[N];
struct Cat{
int a,c;
int id;
bool operator < (const Cat &k) const {
if(a!=k.a) return a<k.a;
else return c<k.c;
}
};
struct Ren{
int b,d;
bool operator < (const Ren &k) const {
return d<k.d;
}
};
Cat cat[N];
Ren ren[N];
int main() {
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&cat[i].a);
for(int i=1;i<=n;i++) scanf("%d",&cat[i].c),cat[i].id=i;
for(int i=1;i<=m;i++) scanf("%d",&ren[i].b);
for(int i=1;i<=m;i++) scanf("%d",&ren[i].d);
sort(cat+1,cat+1+n);
sort(ren+1,ren+1+m);
int last=0;
for(int i=1;i<=m;i++) last=max(last,ren[i].b),maxn[i]=last;
int l=1;
for(int i=1;i<=n;i++) {
while(l<=m&&cat[i].a>=ren[l].d) l++;
if(maxn[l-1]>=cat[i].c) ans[cat[i].id]=maxn[l-1];
else ans[cat[i].id]=-1;
}
for(int i=1;i<=n;i++) printf("%d ",ans[i]);
return 0;
}