tywzoj#315. A-B Problem

内存限制:256 MiB 
时间限制:1000 ms 
标准输入输出
题目类型:传统
 评测方式:文本比较
题目描述 
题目看多了也有审美疲劳,于是我舍弃了大家所熟悉的A+B Problem,改用A-B了哈哈!
好吧,题目是这样的:给出一串数以及一个数字C,要求计算出所有A-B=C的数对的个数。
(不同位置的数字一样的数对算不同的数对)
输入格式
第一行包括2个非负整数N和C,中间用空格隔开。 第二行有N个整数,中间用空格隔开,
作为要求处理的那串数。
输出格式
输出一行,表示该串数中包含的所有满足A-B=C的数对的个数。
样例

input

4 1
1 1 2 3

output

3
数据范围与提示

对于100%的数据,N <= 200000。

所有输入数据都在int范围内。

时间限制:1s

空间限制:256MB

链接: TYWZOJ

AC code:

#include<bits/stdc++.h>
using namespace std;
int a[200005],An[200005],Ak[200005];
int d(int n,int x) {
	int l=1,h=n;
	while(l<=h) {
		int m=(l+h)/2;
		if(An[m]==x) {
			return m;
		} else if(An[m]<x) {
			l=m+1;
		} else {
			h=m-1;
		}
	}
	return 0;
}
int main() {
	int n,c,l=0,cnt=0;
	scanf("%d%d",&n,&c);
	for(int i=1; i<=n; i++) {
		scanf("%d",&a[i]);
	}
	sort(a+1,a+n+1);
	for(int i=1; i<=n; i++) {
		if(a[i]==a[i-1]) {
			Ak[l]++;
		} else {
			An[++l]=a[i],Ak[l]=1;
		}
	}
	for(int i=1; i<=l; i++) {
		int cxk=d(l,An[i]+c);
		if(cxk) {
			cnt+=Ak[cxk]*Ak[i];
		}
	}
	printf("%d\n",cnt);
	return 0;
}

趣味代码(只是改了变量名):

#include<bits/stdc++.h>
using namespace std;
int a[200005],sudfhasfjerykucaswefvbasjhftr4we[200005],seajgdfsbhfasyuefcsbfjwehgfr[200005];
int d(int n,int x) {
	int l=1,ahsdhawgfdawegfyuawgfw=n;
	while(l<=ahsdhawgfdawegfyuawgfw) {
		int asdgadjbjaweghdkbsjfweukf=(l+ahsdhawgfdawegfyuawgfw)/2;
		if(sudfhasfjerykucaswefvbasjhftr4we[asdgadjbjaweghdkbsjfweukf]==x) {
			return asdgadjbjaweghdkbsjfweukf;
		} else if(sudfhasfjerykucaswefvbasjhftr4we[asdgadjbjaweghdkbsjfweukf]<x) {
			l=asdgadjbjaweghdkbsjfweukf+1;
		} else {
			ahsdhawgfdawegfyuawgfw=asdgadjbjaweghdkbsjfweukf-1;
		}
	}
	return 0;
}
int main() {
	int n,c,l=0,sdadfaoshdiurwefdsjhrfaweuif=0;
	scanf("%d%d",&n,&c);
	for(int i=1; i<=n; i++) {
		scanf("%d",&a[i]);
	}
	sort(a+1,a+n+1);
	for(int i=1; i<=n; i++) {
		if(a[i]==a[i-1]) {
			seajgdfsbhfasyuefcsbfjwehgfr[l]++;
		} else {
			sudfhasfjerykucaswefvbasjhftr4we[++l]=a[i],seajgdfsbhfasyuefcsbfjwehgfr[l]=1;
		}
	}
	for(int i=1; i<=l; i++) {
		int cxk=d(l,sudfhasfjerykucaswefvbasjhftr4we[i]+c);
		if(cxk) {
			sdadfaoshdiurwefdsjhrfaweuif+=seajgdfsbhfasyuefcsbfjwehgfr[cxk]*seajgdfsbhfasyuefcsbfjwehgfr[i];
		}
	}
	printf("%d\n",sdadfaoshdiurwefdsjhrfaweuif);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值