猫猫与主人

                                                     猫猫与主人

登录—专业IT笔试面试备考平台_牛客网

 思路:用两个结构体保存,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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值