数对的个数(cogs610)

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

/*简单hash*/
#include<cstdio>
#include<iostream>
#define N 200010
#define mod 1654573
using namespace std;
int head[mod+10],a[N],n,C,ans,cnt;
struct node{
    int v,pre,sum;
};node e[N];
void add(int x,int y){
    for(int i=head[x];i;i=e[i].pre)
        if(e[i].v==y){
            e[i].sum++;return;
        }
    ++cnt;
    e[cnt].v=y;
    e[cnt].pre=head[x];
    e[cnt].sum++;
    head[x]=cnt;
}
int query(int x,int y){
    for(int i=head[x];i;i=e[i].v)
        if(e[i].v==y){
            return e[i].sum;
        }
    return 0;
}
void out(long long x){
    if(x<0)x=-x,putchar(‘-‘);
    if(x>9)out(x/10);
    putchar(x%10+‘0‘);
}
int main(){
    //freopen("jh.in","r",stdin);
    freopen("dec.in","r",stdin);
    freopen("dec.out","w",stdout);
    scanf("%d%d",&n,&C);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        if(a[i]-C<0)continue;
        add((a[i]-C)%mod,a[i]-C);
    }
    long long ans=0;
    for(int i=1;i<=n;i++){
        ans+=(long long)(query(a[i]%mod,a[i]));
    }
    out(ans);
    return 0;
}
时间: 2024-10-25 08:06:47

数对的个数(cogs610)的相关文章

cogs——C610. 数对的个数

http://cogs.pro/cogs/problem/problem.php?pid=610 Description出题是一件痛苦的事情!题目看多了也有审美疲劳,于是我舍弃了大家所熟悉的A+B Problem,改用A-B了哈哈! 好吧,题目是这样的:给出一串数以及一个数字C,要求计算出所有A-B=C的数对的个数. (不同位置的数字一样的数对算不同的数对)Input Format第一行包括2个非负整数N和C,中间用空格隔开.第二行有N个整数,中间用空格隔开,作为要求处理的那串数.Output

用户输入一个数字,找到所有能够除尽它的数的总个数

想不到我这个小学生也会做 <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Document</title> <script type="text/javascript">  //用户输入一个数字,找到所有能够除尽它的数的总个数  var num = window.prompt(

POJ3180(有向图强连通分量结点数&gt;=2的个数)

The Cow Prom Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1451   Accepted: 922 Description The N (2 <= N <= 10,000) cows are so excited: it's prom night! They are dressed in their finest gowns, complete with corsages and new shoes. T

AC日记——数1的个数 openjudge 1.5 40

40:数1的个数 总时间限制:  1000ms 内存限制:  65536kB 描述 给定一个十进制正整数n,写下从1到n的所有整数,然后数一下其中出现的数字“1”的个数. 例如当n=2时,写下1,2.这样只出现了1个“1”:当n=12时,写下1,2,3,4,5,6,7,8,9,10,11,12.这样出现了5个“1”. 输入 正整数n.1 <= n <= 10000. 输出 一个正整数,即“1”的个数. 样例输入 12 样例输出 5 来源 习题(8-11) 医学部 2010 期末试题 尤朝 思路

输入10个整数,把其中最小的数与第一个数交换,最大的数与最后一个数交换。

输入10个整数,把其中最小的数与第一个数交换,最大的数与最后一个数交换.使用3个函数解决问题: (1) 输入10个整数的函数 (2) 进行交换处理的函数 (3) 输出10个数的函数 输出格式 输出结果,一行一个数字 输入样例 2 1 3 4 5 6 7 8 9 0 输出样例 input done swap done 0 1 3 4 5 6 7 8 2 9 display done 1 #include <stdio.h> 2 3 void input(int a[]) 4 { 5 ______

位运算——数0的个数

最简单的方法 移位来运算:N>>=1;然后用N 同1进行"与"运算,来判断末尾是否为1 下面有更快的方法: 快速的方法:判断某一位置是否是1的一个方法,v&=(v-1); 最经典: ? 位操作比除.余操作的效率高了很多.但是,即使采用位操作,时间复杂度仍为O(log2v),log2v为二进制数的位数.那么,还能不能再降低一些复杂度呢?如果有办法让算法的复杂度只与"1"的个数有关,复杂度不就能进一步降低了吗? 同样用10 100 001来举例.如果

数组问题 1.行列有序二维数组中查找2.在一组数成对出现的数中有两个数只出现一次3.在移位数组中查找一个数

一.在一个二维数组中,每一行都按从左到右递增的顺序排序,每一列都按从上到下的递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路: 首先选取数组中右上角的数字.如果该数字等于要查找的的数字,查找过程结束:如果该数字大于要查找的数字,剔除这个数字所在的列:如果该数字小于要查找的数字,剔除这个数字所在的行.也就是说如果要查找的数字不在数组的右上角,则每一次都在数组的查找范围剔除一行或一列,这样每一步都可以缩小查找的范围. 实现过程如下: 运行结果如下:

数1的个数

总时间限制:  1000ms 内存限制:  65536kB 描述 给定一个十进制正整数n,写下从1到n的所有整数,然后数一下其中出现的数字"1"的个数. 例如当n=2时,写下1,2.这样只出现了1个"1":当n=12时,写下1,2,3,4,5,6,7,8,9,10,11,12.这样出现了5个"1". 输入 正整数n.1 <= n <= 10000. 输出 一个正整数,即"1"的个数. 样例输入 12 样例输出 5

Leetcode_001_TwoSum_求和为固定数的两个数的索引

题目描述 给定一个整型数组,在数组中找出两个数使这两个数的和为给定数,从小到大输出这两个数在数组中的位置(我们可以假定输出结果只有一个).例如,输入:N={1,4,8,20}, target=12,输出:index_1=2, index_2=3 方案一 描述 利用C++中的vector和unordered_map尽可能提升程序的运行效率,节约空间,并找出最后的结果.首先回顾一下vector和unordered_map的用法. vector vector是C++中的一种数据结构,更确切的说是一个类