zoukankan      html  css  js  c++  java
  • 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);
    }
  • 相关阅读:
    软工假期预习作业1
    2号团队-团队任务4:每日立会(汇总)
    2号团队-团队任务4:每日立会(2018-11-26)
    2号团队-团队任务4:每日立会(2018-11-27)
    第二小组首次会议记录
    第二次作业
    自我介绍+课后作业1:准备
    Linux安装redis
    Redis面试题
    Mybatis面试题
  • 原文地址:https://www.cnblogs.com/thmyl/p/7196437.html
Copyright © 2011-2022 走看看