题目描述
猫猫从猫儿园回家,路过了一家宠物店。
这里有 nnn 只猫猫,每只猫猫有一个友善值,用正整数 a1,a2,...,ana_1,a_2,...,a_na1,a2,...,an 表示;每只猫猫有一个期望友善值,用正整数 c1,c2,...,cnc_1,c_2,...,c_nc1,c2,...,cn 表示。
有 mmm 个主人,每个主人有一个友善值,用正整数 b1,b2,...,bmb_1,b_2,...,b_mb1,b2,...,bm 表示;每个主人有一个期望友善值,用正整数 d1,d2,..,dmd_1,d_2,..,d_md1,d2,..,dm 表示。
猫猫喜欢友善的主人,主人也喜欢友善的猫猫。猫猫 xxx 可以被主人 yyy 领养,当且仅当 by≥cxb_y \geq c_xby≥cx 且 ax≥dya_x\geq d_yax≥dy,即双方都达到了对方的期望友善值。输入共五行。
对于猫猫 i=1,2,...,ni=1,2,...,ni=1,2,...,n,输出可能领养猫猫 iii 的主人中,最大的友善值。如果没有,输出 −1-1−1。
输入描述:
第一行两个整数 n,mn,mn,m,分别表示猫猫的数量和主人的数量。 第二行 nnn 个整数 a1,a2,...,ana_1,a_2,...,a_na1,a2,...,an 表示猫猫的友善值。 第三行 nnn 个整数 c1,c2,...,cnc_1,c_2,...,c_nc1,c2,...,cn 表示猫猫的期望友善值。 第四行 mmm 个整数 b1,b2,...,bmb_1,b_2,...,b_mb1,b2,...,bm 表示主人的友善值。
第五行 mmm 个整数 d1,d2,...,dmd_1,d_2,...,d_md1,d2,...,dm 表示主人的期望友善值。
1≤n,m≤2⋅105,1≤ai,bi,ci,di≤1091\leq n,m\leq 2\cdot 10^5,1\leq a_i,b_i,c_i,d_i\leq 10^{9}1≤n,m≤2⋅105,1≤ai,bi,ci,di≤109。
输出描述:
一行 nnn 个整数,第 iii 个整数表示可能领养猫猫 iii 的主人中,最大的友善值。如果没有,输出 −1-1−1。
示例1
输入
2 1 10 10 1 100 2 10
输出
2 -1
说明
两只猫猫都满足主人 1 的要求,但是主人不满足猫猫 2 的要求。
按照下述方式读入值可发现,即找出在猫猫左上角的主人的纵坐标的最大值,采取离线询问的方法。首先在读入后,记录下各个猫猫的读入顺序(id),然后对猫猫和主人的横坐标进行排序。依次遍历每一只猫猫的横坐标,在此同时顺序遍历在猫猫右边的主人的纵坐标,记录下最大值。最后在统一输出。
#include<bits/stdc++.h>
using namespace std;
struct p{
int x,y,id;
}a[200001],b[200001];
bool cmp(p a,p b)
{
return a.x<b.x;
}
int ans[200001];
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i].x;
for(int i=1;i<=n;i++)
cin>>a[i].y;
for(int i=1;i<=m;i++)
cin>>b[i].y;
for(int i=1;i<=m;i++)
cin>>b[i].x;
for(int i=1;i<=n;i++)
a[i].id=i;
sort(a+1,a+1+n,cmp);
sort(b+1,b+1+m,cmp);
int pt=1;int maxn=0xc0c0c0c0;
for(int i=1;i<=n;i++)
{
while(pt<=m&&b[pt].x<=a[i].x)
{
maxn=max(maxn,b[pt].y);
pt++;
}
if(maxn>=a[i].y)
ans[a[i].id]=maxn;
else
ans[a[i].id]=-1;
}
for(int i=1;i<=n;i++)
{
cout<<ans[i];
if(i!=n)
cout<<" ";
}
cout<<endl;
return 0;
}