您的位置:首页 > 其它

Codeforces 161A Dress'em in Vests!

2016-07-29 18:49 447 查看
题意:

给你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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: