POJ 2785 4 Values whose Sum is 0 Hash!
http://poj.org/problem?id=2785
题目大意:
给你四个数组a,b,c,d求满足a+b+c+d=0的个数
其中a,b,c,d可能高达2^28
思路:
嗯,没错,和上次的 HDU 1496 Equations hash(见http://blog.csdn.net/murmured/article/details/17596655)差不多,但是那题数据量小,hash值很好得到,不用取模运算。
而这题数据量很大。那就采用开散列的思想。
hash值怎么选取?
上次我看的书中是建议取一个较大的素数,于是,我把400w的素数最大的用筛法输出来了。(用Eratosthenes快速构造素数表http://blog.csdn.net/murmured/article/details/9400845)
#include<cstdio>
const int MAXN=4000000;
bool isprime[MAXN]; int main()
{
for(int i=2;i * i <MAXN;i++)
{
if(!isprime[i])
for(int j=i;j*i<MAXN;j++)
isprime[i*j]=1;
} for(int i=MAXN-1;i>=0;i--)
if(!isprime[i])
{
printf("%d\n",i);
break;
}
return 0;
}
结果为3999971
然后和上一次一样对a,b枚举,然后在对c,d枚举。
当然这样大概2800MS左右,可以采用位运算优化Mod运算。
#include<cstdio>
#include<cstring>
const int mod=3999971; const int MAXN=4000+100;
int a[MAXN],b[MAXN],c[MAXN],d[MAXN];
struct edge
{
int val,next,cnt;
}edge[mod]; int head[mod];
int len=0; inline int gethash(int x)
{
return (x+ mod) % mod;
} void insert(int x)
{
int id=gethash(x);
for(int i=head[id]; i != -1;i=edge[i].next)
{
if(edge[i].val==x)
{
edge[i].cnt++;
return;
}
}
edge[len].cnt=1;
edge[len].next=head[id];
edge[len].val=x;
head[id]=len++;
} int search(int x)
{
int id=gethash(x);
for(int i=head[id] ; i!=-1;i=edge[i].next)
{
if(edge[i].val==x)
return edge[i].cnt;
}
return 0;
} int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=0;i<n;i++)
scanf("%d%d%d%d",&a[i],&b[i],&c[i],&d[i]); memset(head,-1,sizeof(head));
len=0; for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
insert(a[i] + b[j]); long long ans=0;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
ans+=search( - c[i] - d[j] ) ; printf("%lld\n",ans);
}
return 0;
}
对于a模2的整数幂,可以采用 a & ( 1<< x -1)
发现x=22是比较快的。
2047MS
在POJ上排45。。。。。
#include<cstdio>
#include<cstring>
const int mod=1<<22; const int MAXN=4000+100;
int a[MAXN],b[MAXN],c[MAXN],d[MAXN];
struct edge
{
int val,next,cnt;
}edge[mod]; int head[mod];
int len=0; inline int gethash(int x)
{
return (x+ mod) & (mod-1);
} inline void insert(int x)
{
int id=gethash(x);
for(int i=head[id]; i != -1;i=edge[i].next)
{
if(edge[i].val==x)
{
edge[i].cnt++;
return;
}
}
edge[len].cnt=1;
edge[len].next=head[id];
edge[len].val=x;
head[id]=len++;
} inline int search(int x)
{
int id=gethash(x);
for(int i=head[id] ; i!=-1;i=edge[i].next)
{
if(edge[i].val==x)
return edge[i].cnt;
}
return 0;
} int main()
{ int n;
while(~scanf("%d",&n))
{
for(int i=0;i<n;i++)
scanf("%d%d%d%d",&a[i],&b[i],&c[i],&d[i]); memset(head,-1,sizeof(head));
len=0; for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
insert(a[i] + b[j]); long long ans=0;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
ans+=search( - c[i] - d[j] ) ; printf("%lld\n",ans);
}
return 0;
}
POJ 2785 4 Values whose Sum is 0 Hash!的更多相关文章
- POJ 2785 4 Values whose Sum is 0(想法题)
传送门 4 Values whose Sum is 0 Time Limit: 15000MS Memory Limit: 228000K Total Submissions: 20334 A ...
- POJ 2785 4 Values whose Sum is 0
4 Values whose Sum is 0 Time Limit: 15000MS Memory Limit: 228000K Total Submissions: 13069 Accep ...
- POJ - 2785 4 Values whose Sum is 0 二分
4 Values whose Sum is 0 Time Limit: 15000MS Memory Limit: 228000K Total Submissions: 25615 Accep ...
- POJ 2785 4 Values whose Sum is 0(折半枚举+二分)
4 Values whose Sum is 0 Time Limit: 15000MS Memory Limit: 228000K Total Submissions: 25675 Accep ...
- POJ 2785 4 Values whose Sum is 0(暴力枚举的优化策略)
题目链接: https://cn.vjudge.net/problem/POJ-2785 The SUM problem can be formulated as follows: given fou ...
- POJ 2785 4 Values whose Sum is 0(哈希表)
[题目链接] http://poj.org/problem?id=2785 [题目大意] 给出四个数组,从每个数组中选出一个数,使得四个数相加为0,求方案数 [题解] 将a+b存入哈希表,反查-c-d ...
- poj 2785 4 Values whose Sum is 0(折半枚举(双向搜索))
Description The SUM problem can be formulated . In the following, we assume that all lists have the ...
- [POJ] 2785 4 Values whose Sum is 0(双向搜索)
题目地址:http://poj.org/problem?id=2785 #include<cstdio> #include<iostream> #include<stri ...
- POJ 2785 4 Values whose Sum is 0 (二分)题解
思路: 如果用朴素的方法算O(n^4)超时,这里用折半二分.把数组分成两块,分别计算前后两个的和,然后枚举第一个再二分查找第二个中是否有满足和为0的数. 注意和有重复 #include<iost ...
随机推荐
- let---bash中用于计算的工具
- Font-Awesome最新版完整使用教程
何为Font-Awesome Font Awesome gives you scalable vector icons that can instantly be customized - size, ...
- Drupal 关于节点(nodes)的理解
在 Drupal 构建的站点中.全部的内容都是以节点形式存储的,一个节点能够是公布的不论什么一个内容,比方说一个单面(page).一个投票(Poll).一篇文章(article).论坛主题(forum ...
- 微信小程序简单常见首页demo
wxml <view class='index-contier'> <view class="index-left"> <view>电池剩余&l ...
- 洛谷—— P1162 填涂颜色
https://www.luogu.org/problem/show?pid=1162 题目描述 由数字0 组成的方阵中,有一任意形状闭合圈,闭合圈由数字1构成,围圈时只走上下左右4个方向.现要求把闭 ...
- CSS3制作W3cplus的关注面板
<!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...
- amazeui学习笔记一(开始使用2)--布局示例layouts
amazeui学习笔记一(开始使用2)--布局示例layouts 一.总结 1.样例分析(不要忘记,优先分析这个布局示例):有教你页面怎么布局的,实例中可以分析一波 2.响应式:对应meta标签中的v ...
- Maven搭建Spring Security3.2项目详解
本来是打算在上一篇SpringMVC+Hibernate上写的,结果发现上面那篇 一起整合的,结果发现上一篇内容实在是太长了,就另起一篇,这篇主要是采用 Maven搭建Spring+SpringMVC ...
- css实现简单的告警提示动画效果
需求:css实现简单的告警提示动画效果,当接收到实时信息的时候,页面弹出告警信息的动画效果 <!DOCTYPE html> <html lang="en"> ...
- C#委托与事件(生动故事)
[委托] 1,工人Peter按工作步骤向老板报告的程序. 程序: using System; using System.Collections.Generic; using System.Linq; ...