当前位置: 代码迷 >> 综合 >> UVA - 1152 (Hash)
  详细解决方案

UVA - 1152 (Hash)

热度:72   发布时间:2023-11-17 11:08:11.0

题目链接 :地址

紫书 p237 8-3
题意 : T组样例 有abcd四个集合 每个集合有n个数 求从每一个集合中挑出一个数,这四个数的和为0的组合个数

两种方法,目前只写了一种(Hash 法,这种方法第一次用,学习一下)
参考博客 :https://blog.csdn.net/hjt_fathomless/article/details/51361652

Hash 块

struct Hash_map
{static const int mask=0x7fffff;int q[mask+1];int p[mask+1];void clear_(){memset(q,0,sizeof(q));}int& operator [](int x){int i;for(i=x&mask;q[i]&&p[i]!=x;i=(i+1)&mask);p[i]=x;return q[i];}}Hash;

第一次重载 [ ] 号,挺好的
全部代码

#include <bits/stdc++.h>
using namespace std;
const long long mod=1e9+7;
#define ll long long
#define inf 0x3f3f3f3f
void intt()
{freopen("in","r",stdin);}
struct Hash_map
{static const int mask=0x7fffff;int q[mask+1];int p[mask+1];void clear_(){memset(q,0,sizeof(q));}int& operator [](int x){int i;for(i=x&mask;q[i]&&p[i]!=x;i=(i+1)&mask);p[i]=x;return q[i];}}Hash;
int main()
{// intt();int t;cin>>t;while(t--){int a[4003];int b[4003];int c[4003];int d[4003];int n;cin>>n;Hash.clear_();for(int i=0;i<n;i++)cin>>a[i]>>b[i]>>c[i]>>d[i];for(int i=0;i<n;i++){for(int j=0;j<n;j++){Hash[a[i]+b[j]]++;}}ll sum=0;for(int i=0;i<n;i++){for(int j=0;j<n;j++){sum+=Hash[-c[i]-d[j]];// cout<<Hash[-c[i]-d[j]];}}cout<<sum<<endl;if(t)cout<<endl;}return 0;
}

挺实用的方法,感觉比二分好写

二分思路 : 把所有的A+B存起来,排个序,然后用 lower_bound来找和 c[i]+d[j]相反数所在位置 统计个数