UVA 1152 4 Values Whose Sum is Zero(好用的hash标记)
2014-08-03 19:22
441 查看
算法经典入门经典 第二版的题目果然很难啊感觉。 相比第一版的 高效算法来说 直接提升了一个档次。
切入整体。 这个题 是 判定是否有 A B C D 中的四个数 的和 为0 有多少种
其实 算算就会发现 如果存在这样的四个数 那么 a + b = -(c + d);
那么我们就可以判断 是否在 c,d 中存在 -(a+b) 就可以。
如果用四层循环枚举的话 必然超时 而把 a+b 放在一个hash表内 (读入的时候处理即可)
然后判断 -(c+d) 是否在 hash表内即可 (输入的时候判断即可)
这个题和K神搞了好久。 好麻烦的hash。 不过也AC了
后来问了辉哥这个题。 辉哥给了一种简单的hash 他是从watashi 代码中学习的 对于一个无法用数组来标记的数 可以用hash来标记
比如 100这个数 如果 我们在后面判断他是否出现过 可以在前面 用数组 vis[100] = 1; 这样表示出现过。
但是 对于超大的数 10000000000这样的, 数组就无能为力了。 这时候就上hash了
struct Hash_map
{
static const int mask=0x7fffff;
int p[8388608],q[8388608];
void clear()
{
for(int i=0; i<=mask; ++i)
q[i]=0;
}
int& operator [](int k)
{
int i;
for(i=k&mask; q[i]&&p[i]!=k; i=(i+1)&mask);
p[i]=k;
return q[i];
}
}hash;
这是一个hash 结构体 在结构体内 对 [] 进行了重载, 则可以直接用 hash[10000000000] ++; 就标记成功了。
在查询的时候 直接可以 int x = hash[10000000000] ; 即可 很方便吧 哈哈 也就是说 这个 hash 直接实现了对 特别大的数的标记。
下面上这个题的代码。 炫酷至极。
切入整体。 这个题 是 判定是否有 A B C D 中的四个数 的和 为0 有多少种
其实 算算就会发现 如果存在这样的四个数 那么 a + b = -(c + d);
那么我们就可以判断 是否在 c,d 中存在 -(a+b) 就可以。
如果用四层循环枚举的话 必然超时 而把 a+b 放在一个hash表内 (读入的时候处理即可)
然后判断 -(c+d) 是否在 hash表内即可 (输入的时候判断即可)
这个题和K神搞了好久。 好麻烦的hash。 不过也AC了
后来问了辉哥这个题。 辉哥给了一种简单的hash 他是从watashi 代码中学习的 对于一个无法用数组来标记的数 可以用hash来标记
比如 100这个数 如果 我们在后面判断他是否出现过 可以在前面 用数组 vis[100] = 1; 这样表示出现过。
但是 对于超大的数 10000000000这样的, 数组就无能为力了。 这时候就上hash了
struct Hash_map
{
static const int mask=0x7fffff;
int p[8388608],q[8388608];
void clear()
{
for(int i=0; i<=mask; ++i)
q[i]=0;
}
int& operator [](int k)
{
int i;
for(i=k&mask; q[i]&&p[i]!=k; i=(i+1)&mask);
p[i]=k;
return q[i];
}
}hash;
这是一个hash 结构体 在结构体内 对 [] 进行了重载, 则可以直接用 hash[10000000000] ++; 就标记成功了。
在查询的时候 直接可以 int x = hash[10000000000] ; 即可 很方便吧 哈哈 也就是说 这个 hash 直接实现了对 特别大的数的标记。
下面上这个题的代码。 炫酷至极。
#include<iostream> #include<vector> #include<map> #include<algorithm> #include<cstring> #include<cstdio> #include<cstdlib> #include<string> #define ll long long using namespace std; struct Hash_map { static const int mask=0x7fffff; int p[8388608],q[8388608]; void clear() { for(int i=0; i<=mask; ++i) q[i]=0; } int& operator [](int k) { int i; for(i=k&mask; q[i]&&p[i]!=k; i=(i+1)&mask); p[i]=k; return q[i]; } }; int arr[4][4001]; Hash_map hash; int main() { int T; scanf("%d",&T); while(T--) { int n; scanf("%d",&n); hash.clear(); for(int i=0; i<n; ++i) scanf("%d%d%d%d",&arr[0][i],&arr[1][i],&arr[2][i],&arr[3][i]); for(int i=0; i<n; ++i) for(int j=0; j<n; ++j) hash[arr[0][i]+arr[1][j]]++; int ans=0; for(int i=0; i<n; ++i) for(int j=0; j<n; ++j) ans+=hash[-(arr[2][i]+arr[3][j])]; printf("%d\n",ans); if(T)putchar('\n'); } return 0; }
相关文章推荐
- [Hash思想]UVa1152 - 4 Values whose Sum is 0
- uva 1152 4 values whose sum is zero ——yhx
- UVA 1152(p237)----4 Values Whose Sum is Zero
- 例题8-3 和为0的4个值(4 Values Whose Sum is Zero, ACM/ICPC SWERC 2005, UVa 1152)
- UVa1152 - 4 Values whose Sum is 0(hash)
- uva 1152 4 Values whose Sum is 0(二分_中途相遇|| hash)
- 解题报告 之 UVA1152 4 Values Whose Sum is Zero
- UVA1152 4ValuesWhoseSumIsZero
- UVA - 1152 4 Values whose Sum is 0(hash || 二分)
- uva 1152 4 values whose sum is zero ——yhx
- UVA 1152 4 Values Whose Sum is Zero 和为0的4个值 (中途相遇)
- uva 1152 4 values whose sum is zero ——yhx
- 1152 - 4 Values whose Sum is 0(好用的hash标记,多重循环简单化)
- UVA 1152 4 Values whose Sum is 0 (hash)
- uva 1152 4 values whose sum is zero ——yhx
- 和为0的4个值(4 Values Whose sum is Zero UVa 1152)
- uva 1152(4 values whose sum is zero)
- UVA - 1152 4 Values whose Sum is 0 【中途相遇法/二分】
- UVA - 1152 4 Values whose Sum is 0 二分法
- Uva1152——4 Values whose Sum is 0