610. 数对的个数
★★ 输入文件:dec.in
输出文件:
dec.out
简单对比时间限制:1 s 内存限制:128 MB
Description
出题是一件痛苦的事情!
题目看多了也有审美疲劳,于是我舍弃了大家所熟悉的A+B Problem,改用A-B了哈哈!
好吧,题目是这样的:给出一串数以及一个数字C,要求计算出所有A-B=C的数对的个数。
(不同位置的数字一样的数对算不同的数对)
Input Format
第一行包括2个非负整数N和C,中间用空格隔开。
第二行有N个整数,中间用空格隔开,作为要求处理的那串数。
Output Format
输出一行,表示该串数中包含的所有满足A-B=C的数对的个数。
Sample Input
4 1
1 1 2 3
Sample Output
3
Data Limit
对于90%的数据,N <= 2000;
对于100%的数据,N <= 200000。
所有输入数据都在longint范围内。
提交代码 Pascal C C++
/* a-b=c,那么a=b+c,哈希表处理出所有的b+c,找对应即可 */ #include<iostream> #include<cstdio> #include<cstdlib> using namespace std; #define maxn 200010 #define mod 100000 int n,m,a[maxn],num,head[mod+10],ans; struct node{ int to,pre,sum; }e[maxn*4]; void add(int from,int to){ for(int i=head[from];i;i=e[i].pre){ if(e[i].to==to){e[i].sum++;return;} } e[++num].to=to; e[num].pre=head[from]; e[num].sum++; head[from]=num; } void check(int from,int x){ for(int i=head[from];i;i=e[i].pre) if(e[i].to==x)ans+=e[i].sum; } int main(){ freopen("dec.in","r",stdin); freopen("dec.out","w",stdout); //freopen("Cola.txt","r",stdin); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); add((a[i]+m)%mod,a[i]+m); } for(int i=1;i<=n;i++){ check(a[i]%mod,a[i]); } printf("%d",ans); }