【问题描述】
小A教室的墙上挂满了气球,五颜六色,小朋友们非常喜欢。
刚一下课,小朋友们就打算去抢这些气球。每个气球在墙上都有一定的高度,只有当小朋友跳起来时,手能够到的高度大于等于气球的高度,小朋友才能摘到这个气球。为了公平起见,老师让跳的低的小朋友先摘,跳的高的小朋友后摘。小朋友都很贪心,每个小朋友在摘气球的时候都会把自己能摘的气球都摘掉。
很巧的是,小朋友们跳起来手能够着的高度都不一样,这样就不会有跳起来后高度相同的小朋友之间发生争执了。
【输入格式】
第一行输入两个空格分隔的整数n,m,其中n表示小朋友的数量,m表示墙上气球的数量。
第二行输入n个正整数(每两个整数之间用空格隔开),第i个数为 ai,表示第i个小朋友跳起来手能够着的高度为ai。
第三行输入m个正整数(每两个整数之间用空格隔开),第i个数为 hi,表示第i个气球的高度为hi。
【输出格式】
输出一共n行,每行一个整数。第i行表示第i个小朋友摘到的气球数量。
【输入样例】
【样例1】
5 6
3 7 9 6 4
1 2 3 4 5 6
【样例2】
10 10
1 2 3 4 5 6 7 8 9 10
3 1 4 6 7 8 9 9 4 12
【输出样例】
【样例1】
3
0
0
2
1
【样例2】
1
0
1
2
0
1
1
1
2
0
【样例解释】
对于第一组样例输入,摘取气球的顺序依次为1,5,4,2,3号小朋友。1号小朋友能摘1,2,3号气球,5号小朋友能摘4号气球,4号小朋友能摘5,6号气球,2,3号小朋友没有气球可摘了。
【数据规模与约定】
题解:
水题,小朋友从低到高排序,气球从低到高排序,模拟抢气球的过程就行了(注意维护小朋友的顺序来输出答案)
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cmath>
using namespace std;
typedef long long ll;
const int maxn=100005;
int n,m,a[maxn]={0},h[maxn]={0},ord[maxn]={0},ans[maxn]={0};
inline int in(){
int x=0,f=1;char ch=getchar();
while(ch<'0'|ch>'9'){if(ch=='-') f=-f;ch=getchar();}
while(ch<='9'&&ch>='0') x=x*10+ch-'0',ch=getchar();
return x*f;
}
bool cmp(int i,int j){
return a[i]<a[j];
}
int main(){
n=in(),m=in();
for(int i=1;i<=n;i++) a[i]=in(),ord[i]=i;
for(int i=1;i<=m;i++) h[i]=in();
sort(h+1,h+m+1);
sort(ord+1,ord+n+1,cmp);
int fr=1,x;
for(int i=1;i<=n;i++){
x=upper_bound(h+1,h+m+1,a[ord[i]])-h;
ans[ord[i]]=x-fr,fr=x;
if(fr>m) break;
}
for(int i=1;i<=n;i++) printf("%d\n",ans[i]);
return 0;
}