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 ...
随机推荐
- Android 通过OnScrollListener来监听RecyclerView的位置
最近做一个漫画app,在阅读漫画界面需要通过获取recyclerView的位置来实时更新界面上的图片进度(比如1/9), 查阅资料得知了可以通过LayoutManager来获取recyclerView ...
- 计算加班类型以及小时数(js)
function GetDateDiff(startTime, endTime, diffType) { //将xxxx-xx-xx的时间格式,转换为 xxxx/xx/xx的格式 startTime ...
- Java第三方工具库/包汇总
一.科学计算或矩阵运算库 科学计算包: JMathLib是一个用于计算复杂数学表达式并能够图形化显示计算结果的Java开源类库.它是Matlab.Octave.FreeMat.Scilab的一个克隆, ...
- widget-移除底部小部件内容
今天有一个要求,就是在调出手机窗口小部件的时候,让其中的某些小部件不显示.折腾了好久,虽然不知道原理,最终还是实现了屏蔽其中个别小部件的方法.记录下来 要想屏蔽底部小部件的显示,只需要把相关的类跟广播 ...
- 14.NPM 常用命令
转自:http://www.runoob.com/nodejs/nodejs-npm.html PM提供了很多命令,例如install和publish,使用npm help可查看所有命令. NPM提供 ...
- Java Base64、HMAC、SHA1、MD5、AES DES 3DES加密算法
● BASE64 严格地说,属于编码格式,而非加密算法 ● MD5(Message Digest algorithm 5,信息摘要算法) ● SHA(Secure Hash Algo ...
- ORA-16055: FAL request rejected
主库频繁报错如下: ORA-16055: FAL request rejected 解决办法: ALTER SYSTEM SET log_archive_dest_state_2='DEFER' ...
- 【AIM Tech Round 4 (Div. 1) B】Interactive LowerBound
[链接]http://codeforces.com/contest/843/problem/B [题意] 给你一个数组模拟的单链表,放在一个长度为n的数组里面,然后告诉你表头的位置在哪里; 你可以最多 ...
- amazeui学习笔记二(进阶开发2)--Web组件简介Web Component
amazeui学习笔记二(进阶开发2)--Web组件简介Web Component 一.总结 1.amaze ui:amaze ui是一个web 组件, 由模板(hbs).样式(LESS).交互(JS ...
- iOS Threading编程指南 官方文档翻译第一篇(序言)
序言 Thread是能够使多个code paths 在同一个APP内并发运行的几种技术之一.虽然新的技术为并发运行提供了先进.高效的工具(例如operation 对象和GCD),但是OS X和iO ...