uva 11524 Values whose Sum is 0

来源:互联网 发布:知客是什么意思 编辑:程序博客网 时间:2024/06/12 20:52

题目大意:给定四个各包含n个数字的集合,现在问从各个集合中选择一个数,问a + b + c + d = 0 的排列有多少,条件是 (a, b, c ,d )属于 AxBxCxD。

解题:个人觉得此题应该是一个暴力题,就是先计算出a+b ,然后遍历c+d,接下来就是查找一下 a+b = -c-d,有多少种了而已。

我们这里使用hash技术来查询。注:使用STL中map一不小心就、、。。。。。。。TLE。

////  main.cpp//  uva  1152 - 4 Values whose Sum is 0////  Created by XD on 15/8/12.//  Copyright (c) 2015年 XD. All rights reserved.//#include <iostream>#include <string>#include <queue>#include <stack>#include <stdio.h>#include <stdlib.h>#include <math.h>#include<vector>#include <string.h>#include <string>#include <algorithm>#include <set>#include <map>#include <cstdio>#define ll long longusing namespace std ;int A[4010] ;int B[4010] ;int C[4010] ;int D[4010] ;ll ans ;int n ;struct node{    int key ;    ;int num ;    node() ;};node::node(){    num=0 ;}int key[16000010] ;int num[16000010] ;const int hashsize = 1000003 ;int head[hashsize] ;int tnext[160000010] ;void init(){    memset(head, 0, sizeof(head)) ;    memset(tnext, 0, sizeof(int) * (n * n ) + 5) ;//    memset(num, 0, sizeof(n * n )) ;}int HASH(int s){    return abs(s) % hashsize ;}void insert_into_table(int pos){    int h = HASH(key[pos]) ;    int u = head[h] ;    while (u != 0 ) {        if (key[u] == key[pos]) {            num[u]++ ;            return  ;        }        u = tnext[u] ;    }    tnext[pos] = head[h] ;    head[h] = pos ;    num[pos]= 1;}int findNumFromTable(int  k){    int u ;    int h = HASH(k) ;    u = head[h] ;    while (u != 0 ) {        if (key[u] == k) {            return  num[u];        }        u = tnext[u] ;    }    return 0 ;}int main(int argc, const char * argv[]) {    int casenum ;    scanf("%d",&casenum)  ;    int flag = 0 ;    while (casenum--) {        if (flag==1) {            printf("\n") ;        }        flag = 1 ;        scanf("%d" ,&n) ;        for (int i = 0; i<n; i++) {            scanf("%d%d%d%d" , &A[i] ,&B[i],&C[i],&D[i]) ;        }        init() ;        int t = 1 ;        for (int i = 0; i < n; i++) {            for (int j = 0; j < n; j++) {                key[t] = A[i] + B[j] ;                insert_into_table(t) ;                t++ ;            }        }        ans = 0 ;        for (int i = 0; i < n; i++) {            for (int j = 0; j < n; j++) {                int k  = C[i] + D[j]  ;                ans += findNumFromTable(-k) ;            }        }        printf("%lld\n" ,ans) ;    }    return 0;}



0 0