中途相遇法,这题目总结后我感觉和第一篇博客很像,他们都取了中间,也许这就是二分的魅力吧

这题题意就是从ABCD四个集合中选四个元素使他们的和为0

题意很简单,但是实现起来很容易超时,不能一个一个枚举

然后就想到了枚举两个,那么新生成EF两个集合大小为n方,然后如何查找?

最容易想到的就是用map标记,但汝佳说了这会超时,我不信,试了一发,超时了!!!

除了用map还能用什么呢,联想到之前那个UVA对称的题目,我们可以sort一下,然后查找e的相反数时候,二分查找-e,记住,找到还不行,有可能存在多个-e.所以upper_bound-lower_bound 就可以了,然后就这样过了

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<queue>
#include<cstdlib>
#include<algorithm>
#include<stack>
#include<map>
#include<queue>
#include<vector>
using namespace std;
int t,n,a,b,c,d,kase,cnt;
int num[4][4040],sum1[16000040],sum2[16000040];
map<int,int> list;
int main(){
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
kase=0;
cin>>t;
while(t--){
memset(num,0,sizeof num);
memset(sum1,0,sizeof sum1);
memset(sum2,0,sizeof sum2);
cnt=0;
if(kase++) cout<<"\n";
cin>>n;
for(int i=0;i<n;i++)
scanf("%d%d%d%d",&num[0][i],&num[1][i],&num[2][i],&num[3][i]);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
sum1[i*n+j]=num[0][i]+num[1][j];
sum1[i*n+j]=-sum1[i*n+j];
}
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
sum2[i*n+j]=num[2][i]+num[3][j]; }
}
sort(sum1,sum1+n*n);
sort(sum2,sum2+n*n);
int end=n*n,pos1=0,pos2=0;
for(int i=0;i<end;i++){
pos1 = lower_bound(sum2+pos1,sum2+end,sum1[i]) -sum2;
pos2 = upper_bound(sum2+pos1,sum2+end,sum1[i]) -sum2;
if(pos1==end) break;
cnt+=pos2-pos1;
pos1=max(pos1-1,0);
}
cout<<cnt<<endl;
}
return 0;
}

UVA1152_4 Values whose Sum is 0的更多相关文章

  1. POJ 2785 4 Values whose Sum is 0(想法题)

    传送门 4 Values whose Sum is 0 Time Limit: 15000MS   Memory Limit: 228000K Total Submissions: 20334   A ...

  2. POJ 2785 4 Values whose Sum is 0

    4 Values whose Sum is 0 Time Limit: 15000MS   Memory Limit: 228000K Total Submissions: 13069   Accep ...

  3. 哈希-4 Values whose Sum is 0 分类: POJ 哈希 2015-08-07 09:51 3人阅读 评论(0) 收藏

    4 Values whose Sum is 0 Time Limit: 15000MS Memory Limit: 228000K Total Submissions: 17875 Accepted: ...

  4. [poj2785]4 Values whose Sum is 0(hash或二分)

    4 Values whose Sum is 0 Time Limit: 15000MS Memory Limit: 228000K Total Submissions: 19322 Accepted: ...

  5. K - 4 Values whose Sum is 0(中途相遇法)

    K - 4 Values whose Sum is 0 Crawling in process... Crawling failed Time Limit:9000MS     Memory Limi ...

  6. UVA 1152 4 Values whose Sum is 0 (枚举+中途相遇法)(+Java版)(Java手撕快排+二分)

    4 Values whose Sum is 0 题目链接:https://cn.vjudge.net/problem/UVA-1152 ——每天在线,欢迎留言谈论. 题目大意: 给定4个n(1< ...

  7. UVA1152-4 Values whose Sum is 0(分块)

    Problem UVA1152-4 Values whose Sum is 0 Accept: 794  Submit: 10087Time Limit: 9000 mSec Problem Desc ...

  8. POJ - 2785 4 Values whose Sum is 0 二分

    4 Values whose Sum is 0 Time Limit: 15000MS   Memory Limit: 228000K Total Submissions: 25615   Accep ...

  9. POJ 2785 4 Values whose Sum is 0(折半枚举+二分)

    4 Values whose Sum is 0 Time Limit: 15000MS   Memory Limit: 228000K Total Submissions: 25675   Accep ...

随机推荐

  1. appium常见问题04_查看andriod内置浏览器webview版本

    方法一:手机上设置中查看 设置-->应用程序管理-->全部-->Android System WebView 方法二:adb指令查看(前提,已安装android sdk环境) 1,w ...

  2. IDEA-Tomcat 运行报错

    我的问题是SDK版本不一致

  3. Java并发Condition接口

    java.util.concurrent.locks.Condition接口提供一个线程挂起执行的能力,直到给定的条件为真. Condition对象必须绑定到Lock,并使用newCondition( ...

  4. UVALive 4728 Squares(旋转卡壳)

    Squares The famous Korean IT company  plans to make a digital map of the Earth with help of wireless ...

  5. kubernetes容器集群管理启动一个测试示例

    创建nginx 创建3个nginx副本 [root@master bin]# kubectl run nginx --image=nginx --replicas=3 kubectl run --ge ...

  6. Linux系统实验

    前言:怎么感觉Linux运维和Linux系统实验没什么关系?该不会的还是不会(@@).记录一下几个实验吧. 本篇目录: 实验一 编程环境 实验二 文件读写 实验三 进程通信 实验一 编程环境√ 实验步 ...

  7. Oracle之分页问题

    前面的Top-N问题使用了reownum,但是又遇到个分页问题,将表emp的4行为1页输出,前4行很好做: select rownum,empno,ename,sal from emp ; 但是4-- ...

  8. Codeforces 669E cdq分治

    题意:你需要维护一个multiset,支持以下操作: 1:在某个时间点向multiset插入一个数. 2:在某个时间点在multiset中删除一个数. 3:在某个时间点查询multiset的某个数的个 ...

  9. webshell yar

    webshell D盾 http://www.d99net.net/

  10. php 字符转成数字

    1.第一种转换方式:在要转换的变量之前加上用括号括起来的目标类型,如 (int):(bool):(float):(string):(array):(object) 2.第二种转换方式:使用3个具体类型 ...