【HASH】【UVA 10125】 Sumset
Description
给定一个整数集合S,求一个最大的d,满足a+b+c=d,其中a,b,c,d∈S
Input
多组数据,每组数据包括:
- 第一行一个整数n,代表元素个数
- 下面n行每行一个整数,代表集合元素
输入结束的标志为n=0。
Output
对于每组数据,输出:
- 一行,如果有解,输出一个整数,代表最大的d;否则输出no solution
Sample Input
Sample Output
no solution
Hint
n≤1000,保证输入的集合元素互不相同。
集合中的元素∈[-536 870 912,536 870 911]。
Solution
考虑暴力做法:暴力枚举a,b,c,d,复杂度O(n4),无法承受。
考虑对于给定的d,和c,有唯一确定的a+b的值与之对应。所以我们考虑使用O(n2)的时间枚举可以产生的a+b的值并进行存储,然后枚举d和c,计算出d-c=a+b,判断是否可行。
如何存储a+b呢?普通数组显然开不下,考虑使用set或者map,我们发现在极端情况下,整个算法的复杂度为O(n2logn)。大概是108大小的运算量。考虑到多组数据,这个这个复杂度要GG。
考虑使用HASH,将a+b的值作为hash值,在信息中存储a+b的值,a的下标和b的下标,将hash值相同的按照链式前向星的形式挂成链。期望意义下的复杂度为O(n2),可以通过本题。
另外,如果担心取模变慢,在代码中我采取了&19260817的方式代替取模,但是在链的长度上,应该不如膜大质数的方式。科学性有待考证
Code
#include<map>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define rg register
#define ci const int inline void qr(int &x) {
char ch=getchar(),lst=NULL;
while(ch>''||ch<'') lst=ch,ch=getchar();
while(ch>=''&&ch<='') x=(x<<)+(x<<)+(ch^),ch=getchar();
if (lst=='-') x=-x;
} char buf[];
inline void write(int x,const char aft,const bool pt) {
if(x<) {putchar('-');x=-x;}
int top=;
do {
buf[++top]=x%+'';
x/=;
} while(x);
while(top) putchar(buf[top--]);
if(pt) putchar(aft);
} template <typename T>
inline T mmax(const T &a,const T &b) {if(a>b) return a;return b;}
template <typename T>
inline T mmin(const T &a,const T &b) {if(a<b) return a;return b;}
template <typename T>
inline T mabs(const T &a) {if(a<) return -a;return a;} template <typename T>
inline void mswap(T &a,T &b) {T temp=a;a=b;b=temp;} const int maxn = ;
const int maxt = ;
const int upceil = ; struct HASH {
int v,nxt,a,b;
};
HASH lst[maxt];int hd[upceil+],cnt;
inline void ist(ci v,ci key,ci a,ci b) {
HASH &now=lst[++cnt];
now.v=v;now.nxt=hd[key];now.a=a;now.b=b;hd[key]=cnt;
} inline int get_HASH(ci x) {
return ((x<<)+(x>>))&upceil;
} inline bool judge(ci a,ci b,ci c,ci d) {
if(a==c||a==d||b==c||b==d) return false;
return true;
} int n,MU[maxn]; void clear() ; int main() {
qr(n);
while(n) {
clear();
for(rg int i=;i<=n;++i) qr(MU[i]);
std::sort(MU+,MU++n);
for(rg int i=;i<=n;++i)
for(rg int j=i+;j<=n;++j) {
ist(MU[i]+MU[j],get_HASH(MU[i]+MU[j]),i,j);
}
for(rg int i=n;i;--i) {
for(rg int j=;j<=n;++j) if(i!=j) {
int delta=MU[i]-MU[j];
int k=get_HASH(delta);
if(!hd[k]) continue;
for(int h=hd[k];h;h=lst[h].nxt) if(lst[h].v==delta) {
if(judge(lst[h].a,lst[h].b,i,j)) {write(MU[i],'\n',true);goto loop;}
}
}
}
puts("no solution");
loop:
n=;qr(n);
}
} void clear() {
memset(hd,,sizeof hd);
memset(MU,,sizeof MU);
memset(lst,,sizeof lst);
cnt=;
}
Summary
考虑存储一个元素的多个信息且map复杂度超标的时候,不妨考虑HASH。
【HASH】【UVA 10125】 Sumset的更多相关文章
- 51nod 1095 Anigram单词【hash/map/排序/字典树】
1095 Anigram单词 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 一个单词a如果通过交换单词中字母的顺序可以得到另外的单词b,那么定义b ...
- [BZOJ 3207] 花神的嘲讽计划Ⅰ【Hash + 可持久化线段树】
题目链接:BZOJ - 3207 题目分析 先使用Hash,把每个长度为 k 的序列转为一个整数,然后题目就转化为了询问某个区间内有没有整数 x . 这一步可以使用可持久化线段树来做,虽然感觉可以有更 ...
- 【HDOJ3567】【预处理bfs+映射+康拓展开hash】
http://acm.hdu.edu.cn/showproblem.php?pid=3567 Eight II Time Limit: 4000/2000 MS (Java/Others) Me ...
- POJ 1200 Crazy Search【Hash入门】
RK法:https://www.cnblogs.com/16crow/p/6879988.html #include<cstdio> #include<string> #inc ...
- 【UVa 10881】Piotr's Ants
Piotr's Ants Porsition:Uva 10881 白书P9 中文改编题:[T^T][FJUT]第二届新生赛真S题地震了 "One thing is for certain: ...
- 【UVa 116】Unidirectional TSP
[Link]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...
- 【UVa 1347】Tour
[Link]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...
- 【UVA 437】The Tower of Babylon(记忆化搜索写法)
[题目链接]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...
- 【uva 1025】A Spy in the Metro
[题目链接]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...
随机推荐
- Selenium WebDriver(Python)API
1.通过示例介绍Selenium-WebDriver 一个简单的入门方法就是这个例子,它在Google上搜索术语“Cheese”,然后将结果页面的标题输出到控制台. java csharp pytho ...
- Navicat 导入sql脚本文件
Navicat 导入sql脚本文件 我在组建自己工作用的数据库时要导入.sql脚本文件,用cmd窗口导入太慢,navicat的导入向导里又无导入sql脚本的选项, 但不是navicat中没有导入sql ...
- MySQL☞having子句
having子句:是跟group by结合使用,对分组以后的数据再次进行过滤,经常跟聚合函数结合使用 格式: select 列名/聚合函数 from 表名 where 条件 group by ...
- python基本数据类型——集合
集合 无序可变序列,集合中元素不允许重复,即每个元素都是唯一的 集合中的元素按照升序排列 # 创建集合 >>aset = set([0,2,4,5,7,2,3,5,9,0]) >&g ...
- ionic typescript--验证码发送倒计时功能
1.新建页面 ionic g page forget 2.mode.html文件 <ion-item> <ion-input clearInput [(ngModel)]='co ...
- VT-x VT-d 虚拟化在win10中的问题
win10真的是非常非常非常非常非常非常非常非常非常非常坑坑坑坑坑坑坑坑坑坑坑坑坑坑坑坑!!!!!! 自带虚拟Buff不说,我不用竟然会有冲突!!!! 一度让我怀疑,我的CPU VT-x坏掉了!!! ...
- 1.编译azkaban
1.下载azkaban的源码 https://github.com/azkaban/azkaban.git 然后解压得到azkaban-master.zip,解压:unzip azkaban-mast ...
- Centos6配置开启FTP Server
vsftpd作为FTP服务器,在Linux系统中是非常常用的.下面我们介绍如何在centos系统上安装vsftp. 什么是vsftpd vsftpd是一款在Linux发行版中最受推崇的FTP服务器程序 ...
- JQuery中each方法实现
each()函数是基本上所有的框架都提供了的一个工具类函数,通过它,你可以遍历对象.数组的属性值并进行处理. jQuery和jQuery对象都实现了该方法,对于jQuery对象,只是把each方法简单 ...
- 算法与数据结构实验题 6.3 search
★实验任务 可怜的 Bibi 刚刚回到家,就发现自己的手机丢了,现在他决定回头去搜索 自己的手机. 现在我们假设 Bibi 的家位于一棵二叉树的根部.在 Bibi 的心中,每个节点 都有一个权值 x, ...