cogs 610. 数对的个数

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范围内。
 


/*
    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);
}

 

posted @ 2017-07-17 17:07  Echo宝贝儿  阅读(203)  评论(0编辑  收藏  举报