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;}
阅读全文
0 0
- uva
- UVA
- UVA
- UVA
- uva
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- 小组讨论时的问题
- 将应用程序打包进openwrt固件,随着系统自启动
- 实验6:树和二叉树的实验2 二叉链表
- TensorFlow在训练模型时指定GPU进行训练
- 自定义View圆形进度条带跳转页面
- UVA
- vmware10新建redhat7系统操作教程
- Java阶段学习心得
- 关于fragment和activty的通信个人的总结浅谈
- 自定义view继承LinearLayout实现购物车数量的加减
- 数据库视频(七)
- 对于图的储存的总结(一)
- python开头两行code
- Java String的常用方法