题解 | #完美对#
完美对
http://www.nowcoder.com/practice/f5a3b5ab02ed4202a8b54dfb76ad035e
容易观察得到两个元素是完美对,它们的K个属性的差分为相反数,差分之和也为相反数。
因此,用哈希法存储元素下标,用K个属性的差分之和作为哈希值。
#include <bits/stdc++.h> typedef long long ll; using namespace std; int a[100005][11]; int n,k; vector<int>head[2005]; bool check(int x,int y) { int sum=a[x][1]+a[y][1]; for(int i=2;i<=k;i++) if(a[x][i]+a[y][i]!=sum) return false; return true; } int main() { ios::sync_with_stdio(0),cin.tie(0); int i,j,ans=0; cin>>n>>k; for(i=1;i<=n;i++) for(j=1;j<=k;j++) cin>>a[i][j]; for(i=1;i<=n;i++) { int sum=0; for(j=2;j<=k;j++) sum+=a[i][j]-a[i][j-1]; for(j=0;j<head[-sum+1000].size();j++) if(check(i,head[-sum+1000][j])) ans++; head[sum+1000].push_back(i); } cout<<ans; return 0; }