UVA

来源:互联网 发布:oracle 数据备份 编辑:程序博客网 时间:2024/06/05 02:41

题目链接:https://vjudge.net/problem/UVA-1152

题目大意:在四个数组中各取一个数,之和=0的方案数

解题思路:枚举前两个数组,把后两个数组之和放到hash表里(用map会超时)

AC代码:

#include<cstdio>#include<cstring>#include<iostream>using namespace std;typedef long long LL;const int MAXN = 4000 + 5;const int MAXSIZE = 16000000 * 2 + 5;int arr[4][MAXN];struct Edge{    int _value, _numb, _next;    Edge(int value = 0, int numb = 0, int next = 0) :        _value(value), _numb(numb), _next(next) {}}_edge[MAXSIZE];int _head[MAXSIZE];struct Hash_table{    int _bulk;    Hash_table()    {        _bulk = 0;        memset(_head, -1, sizeof(_head));    }    int& operator[] (int value)    {        int pos = (value%MAXSIZE + MAXSIZE) % MAXSIZE;        for (int i = _head[pos];;i = _edge[i]._next)        {            if (i == -1) break;            if (_edge[i]._value == value)                return _edge[i]._numb;        }        _edge[_bulk] = Edge(value, 0, _head[pos]);        _head[pos] = _bulk++;        return _edge[_bulk - 1]._numb;    }};int main(){    int t;scanf("%d", &t);    for(int k=1;k<=t;k++)    {        Hash_table mp;        int n;scanf("%d", &n);        for (int i = 0;i < n;i++)            for (int j = 0;j < 4;j++)                scanf("%d", &arr[j][i]);        for (int i = 0;i < n;i++)            for (int j = 0;j < n;j++)                mp[arr[2][i] + arr[3][j]]++;        LL ans = 0;        for(int i=0;i<n;i++)            for (int j = 0;j < n;j++)                ans += mp[-arr[0][i] - arr[1][j]];        if (k != 1)            cout << endl;        cout << ans << endl;    }    return 0;}
原创粉丝点击