题解: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

代码

cpp 复制代码
#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;
	}
}