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

自动选择评测机打开 O2 优化COGS Grader无优化开关


提交代码 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);
}

 

转载于:https://www.cnblogs.com/thmyl/p/7196437.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值