Description
L一直认为,在他的收集来的众多卡片中,如果存在Am + An + Ap = Ai(1 <= m n p < i)(m n p可以相同)的话,卡片号码为Ai的卡片就是一张好人卡。现在,L有一堆卡片,他想知道这里面中有多少张好人卡,请你帮帮他。
Input
第一行只有一个正整数N,意义如上。
第二行包含N个整数,表示An。
Output
输出一个整数,表示这个数列中好人卡的张数。
Input 1 2 1 3 Input 2 6 1 2 3 5 7 10 Input 3 3 -1 2 0
-
Sample Input
Output 1 1 Output 2 4 Output3 1
-
Sample Output
HINT
对于10%的数据 1<=N<=10
对于40%的数据 1<=N<=500 -10^5<=Ai<=10^5
对于70%的数据 1<=N<=5000 -10^6<=Ai<=10^6
对于100%的数据 1<=N<=5000 -10^9<=Ai<=10^9
Source/Category
即a[m]+a[n]=a[p]−a[i],直接哈希查找。
对了STL慢的一批要手写
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 5010, MAXM = MAXN*MAXN/2, mod = 20180905;
int a[MAXN], key[MAXM], nxt[MAXM], head[mod+6], cnt=0;
void insert(int x) { // 插入哈希
int id = x&mod;
key[++cnt]=x; nxt[cnt]=head[id]; head[id]=cnt;
}
bool count(int x) { // 查找
for (int i=head[x&mod]; i; i=nxt[i]) {
if (key[i]==x) return true;
}
return false;
}
int main() {
int n, res=0; scanf("%d", &n);
for (int i=1; i<=n; ++i) {
scanf("%d", a+i);
for (int j=1; j<i; ++j) {
if (count(a[i]-a[j])) { // 找到了,退出
++res; break;
}
}
for (int j=1; j<=i; ++j) insert(a[i]+a[j]); // 把和加入哈希
}
printf("%d", res);
return 0;
}