题解:AT_abc382_c [ABC382C] Kaiten Sushi
题目传送门
思路
首先看一下数据范围。
- \(1 \leq N, M \leq 2 \times 10^5\)
- \(1 \leq A_i, B_i \leq 2 \times 10^5\)
这么大的数据范围肯定不能直接写二重循环暴力。
考虑一下,应为它是从每个人面前顺序经过的。那我们就可以按照顺序,依次枚举这 \(N\) 个人。
首先记录这些食物对应的序号,再的按照美味度从小到大排序。
依次枚举这 \(N\) 个人,只要发现一个不小于他的品味值的食物,就给这个食物打上标记,同时指针往前移一位。
如果所有的食物都已经被打上了标记,就提前跳出循环。
否则到最后的时候,就按照标记输出,如果这个食物没有被打上标记,就输出 -1
。
代码
#include<bits/stdc++.h>
using namespace std;
struct no
{
int x,y;
}h[1000000];
int cmp(no q,no w)
{
return q.x<w.x;
}
int hh[1000000];
int a[1000000];
int main()
{
ios::sync_with_stdio(false);
cin.tie(),cout.tie();
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=m;i++)
{
cin>>h[i].x;
h[i].y=i;
}
sort(h+1,h+m+1,cmp);
int x=m+1;
// for(int i=1;i<=m;i++)
// cout<<h[i].x<<" ";
// cout<<endl;
// for(int i=1;i<=m;i++)
// cout<<h[i].y<<" ";
for(int i=1;i<=n;i++)
{
if(x==0)
break;
while(1)
{
x--;
if(h[x].x>=a[i])
{
hh[h[x].y]=i;
}
else
{
x++;
break;
}
}
}
for(int i=1;i<=m;i++)
{
if(hh[i]==0)
cout<<-1;
else
cout<<hh[i];
cout<<endl;
}
}