Codeforces 161A Dress'em in Vests!

来源:互联网 发布:私募股权投资数据 编辑:程序博客网 时间:2024/04/29 05:30

题意:

给你n<=1e5个a[i]和m<=1e5个b[i]和x、y,每个a[i]有个适配范围(a[i]-x,a[i]+y),每个b[i]如果在某个a[i]范围内即可适配而且只适配一次,问你最多能有几个b[i]适配。

思路:

先将a、b排个序,然后枚举a[i]和b[j]如果能适配就i++,j++,如果b[j]<a[i]-x那么说明b[j]对后面的a[i]也都不能适配(因为我们已经将a按从小到大排了)就j++,否则i++。

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int MAX=1e5+5;int n,m,x,y,ans[MAX];struct Node{int s,id;}a[MAX],b[MAX];bool cmp(Node a,Node b){return a.s<b.s;}int main(){scanf("%d%d%d%d",&n,&m,&x,&y);for(int i=1;i<=n;i++){scanf("%d",&a[i].s);a[i].id=i;}for(int i=1;i<=m;i++){scanf("%d",&b[i].s);b[i].id=i;}sort(a+1,a+1+n,cmp);sort(b+1,b+1+m,cmp);int j=1,cnt=0;memset(ans,-1,sizeof(ans));for(int i=1;i<=n;i++){while(b[j].s<a[i].s-x&&j<=m) j++;if(a[i].s-x<=b[j].s&&a[i].s+y>=b[j].s){ans[i]=j;j++;cnt++;}if(j>m) break;}printf("%d\n",cnt);for(int i=1;i<=n;i++){if(ans[i]!=-1) printf("%d %d\n",i,ans[i]);}return 0;}


0 0
原创粉丝点击