HDU 4334 Contest 4
本来以为是一道水题,好吧,做了才知道,出题的人有多牛。二分搜索是不可能的了,因为会超内存。。。
看到别人的搜索两个集合的提示,我就自己一边去想了。终于想出来了:
可以这样做,先把每两个集合的和值枚举出来并成一个大集合,排序,去重。剩下一个集合,于是,共三个集合。
枚举小的那个集合的元素,搜索两个大的集合。可以这样做,定义一个初始为指向最小元素的指针,一个指向最大元素的指针(两个指针是指向不同的集合的),两者之和相等则返回,小于则移动小指针+1,否则移动大指针-1.直至二者相等退出。然后再用两个指针交换指向另一个集合,重复上述过程。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define LL __int64
using namespace std; LL A[41000],B[41000];
LL C[41000];
int pa,pb;
LL S[5][250]; bool find_t(LL a){
int tma,tmi;
LL tmp;
tma=pa,tmi=1;
while(tma>=1&&tmi<=tma&&tmi<=pb){
tmp=A[tma]+B[tmi];
if(tmp==a) return true;
else if(tmp<a) tmi++;
else tma--;
}
tma=pb,tmi=1;
while(tma>=1&&tmi<=tma&&tmi<=pa){
tmp=A[tmi]+B[tma];
if(tmp==a) return true;
else if(tmp<a) tmi++;
else tma--;
}
return false;
} bool cmp(LL a,LL b){
if(a<b) return true;
return false;
} int main(){
int T,n;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int i=0;i<5;i++){
for(int j=1;j<=n;j++)
scanf("%I64d",&S[i][j]);
}
pa=pb=0;
C[0]=A[0]=B[0]=0; int tb=0;
for(int i=0;i<=1;i++){
pb=0;
for(int j=1;j<=n;j++){
if(tb==0)
C[++pb]=C[0]+S[i][j];
else{
for(int k=1;k<=tb;k++)
B[++pb]=C[k]+S[i][j];
}
}
if(tb==0)
tb=n;
else tb=tb*n;
} tb=0;
for(int i=2;i<4;i++){
pa=0;
for(int j=1;j<=n;j++){
if(tb==0)
C[++pa]=C[0]+S[i][j];
else{
for(int k=1;k<=tb;k++)
A[++pa]=C[k]+S[i][j];
}
}
if(tb==0)
tb=n;
else tb=tb*n;
} int t=1;
sort(A+1,A+pa+1,cmp);
for(int i=2;i<=pa;i++)
if(A[i]!=A[t]){
A[++t]=A[i];
}
pa=t; t=1;
sort(B+1,B+pb+1,cmp);
for(int i=2;i<=pb;i++)
if(B[i]!=B[t]){
B[++t]=B[i];
}
pb=t; bool flag=false; for(int j=1;j<n;j++){
if(find_t(-S[4][j])){
flag=true;
break;
}
} if(flag)
printf("Yes\n");
else printf("No\n");
}
return 0;
}
HDU 4334 Contest 4的更多相关文章
- HDU 4334 Trouble (暴力)
Trouble Time Limit: 5000MS Memory Limit: 32768KB 64bit IO Format: %I64d & %I64u Submit Statu ...
- HDU 5045 Contest(状压DP)
Problem Description In the ACM International Collegiate Programming Contest, each team consist of th ...
- hdu - 5045 - Contest(国家压缩dp)
意甲冠军:N个人M通过主打歌有自己的期望,每个问题发送人玩.它不能超过随机播放的次数1,追求最大业绩预期 (1 ≤ N ≤ 10,1 ≤ M ≤ 1000). 主题链接:pid=5045" ...
- [ACM] hdu 5045 Contest (减少国家Dp)
Contest Problem Description In the ACM International Collegiate Programming Contest, each team consi ...
- HDU–5988-Coding Contest(最小费用最大流变形)
Coding Contest Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)To ...
- HDU 4334 Trouble
Trouble Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- hdu 5045 Contest(状态压缩DP)
题解:我们使用一个二位数组dp[i][j]记录进行到第i个任务时,人组合为j时的最大和(这里的j我们用二进制的每位相应一个人). 详细见代码: #include <iostream> #i ...
- HDU 5045 Contest
pid=5045">主题链接~~> 做题感悟:比赛时这题后来才写的,有点小尴尬.两个人商议着写写了非常久才写出来,I want to Powerful ,I believe me ...
- Trouble HDU - 4334
Hassan is in trouble. His mathematics teacher has given him a very difficult problem called 5-sum. P ...
随机推荐
- opencv3.2+opencv_contrib+cmake
转自原文 opencv3.2+opencv_contrib+cmake 心得体会 初学OpenCV发现opencv3.2(下载链接在附录)是没有xfeatures2d等模块的.第三方库opencv_c ...
- spring容器启动过程理解
一.一切从手动启动IoC容器开始 ClassPathResource resource = new ClassPathResource("bean.xml"); DefaultLi ...
- POJ 2110
终于过了,SHIT,二分+DFS即可,二分区间,根据数字是否在区间内,变成迷宫题了.枚举第一个格子,二分上界,即可. #include <iostream> #include <cs ...
- 数据结构 - 归并排序(merging sort) 具体解释 及 代码
归并排序(merging sort) 具体解释 及 代码 本文地址: http://blog.csdn.net/caroline_wendy 归并排序(merging sort): 包括2-路归并排序 ...
- R语言基础-数组和列表
数组(array) 一维数据是向量,二维数据是矩阵,数组是向量和矩阵的直接推广,是由三维或三维以上的数据构成的. 数组函数是array(),语法是:array(dadta, dim),当中data必须 ...
- Spark SQL with Hive
前一篇文章是Spark SQL的入门篇Spark SQL初探,介绍了一些基础知识和API,可是离我们的日常使用还似乎差了一步之遥. 终结Shark的利用有2个: 1.和Spark程序的集成有诸多限制 ...
- ubuntu13.10升级到ubuntu14.04
Upgrading from Ubuntu 13.10 To upgrade from Ubuntu 13.10 on a desktop system: Open Software Sources. ...
- 最长公共子序列(Swift版本)
class Mark { var count: Int var type: Int init(count: Int, type: Int) { self ...
- webview同步cookies
目前很多android app都内置了可以显示web页面的界面,会发现这个界面一般都是由一个叫做WebView的组件渲染出来的,学习该组件可以为你的app开发提升扩展性. 先说下WebView的一些优 ...
- tabBar的图标不被系统渲染
navi.tabBarItem.selectedImage = [[UIImage imageNamed:imageStr]imageWithRenderingMode:UIImageRenderin ...