POJ2785 4 Values whose Sum is 0(折半枚举+二分)
来源:互联网 发布:观后感怎么写 知乎 编辑:程序博客网 时间:2024/05/21 14:49
题目大意
给定A B C D四个数组,每个数组里面有n(n<=40000)个数
问从四个数组里各选一个数,相加等于零的情况有多少种
(如果两个数值相同而位置不同算同一种情况)
思路
如果是四重循环找,不用说绝对超时
那么就需要用到一些优化了
其实我们可以先将C和D的情况先枚举出来(两重循环)并对其排序
然后再用两重循环将A和B的和的情况取相反数
再用upper_bound和lower_bound找到在有序数组内有没有相等的数,累加答案
(upper_bound找到大于的数,lower_bound找到大于等于的数,相减就是结果)
#include<cstdio>#include<cstring>#include<algorithm>#define ll long longusing namespace std;ll A[4005],B[4005],C[4005],D[4005];ll fcd[16000005],ans,s;int n,len;int main(){ ans=0;len=0; scanf("%d",&n); for(int i=1;i<=n;++i) scanf("%lld%lld%lld%lld",&A[i],&B[i],&C[i],&D[i]); for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) fcd[++len]=C[i]+D[j];//枚举C和D的所有方案 sort(fcd+1,fcd+len+1);//lower_bound和upper_bound一定要有序 for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) { s=-(A[i]+B[j]);//记得是早相反数 ans+=upper_bound(fcd+1,fcd+len+1,s)-lower_bound(fcd+1,fcd+len+1,s); } printf("%lld\n",ans); return 0;}
阅读全文
0 0
- POJ2785 -- 4 Values whose Sum is 0(折半枚举)
- POJ2785 4 Values whose Sum is 0(折半枚举+二分)
- POJ2785:4 Values whose Sum is 0(二分+暴力)
- POJ2785-4 Values whose Sum is 0【折半搜索】
- POJ2785 4 Values whose Sum is 0 【枚举】
- POJ2785:4 Values whose Sum is 0(二分)
- POJ2785 4 Values whose Sum is 0(二分)
- POJ2785 4 Values whose Sum is 0(暴力二分查找)
- 4 Values whose Sum is 0 (折半枚举)
- POJ2785 4 Values whose Sum is 0
- POJ2785 4 Values whose Sum is 0
- poj2785(4 Values whose Sum is 0)
- POJ2785-4 Values whose Sum is 0
- poj2785 4 Values whose Sum is 0
- POJ2785-4 Values whose Sum is 0
- Poj2785 (4 Values whose Sum is 0)
- POJ2785 4 Values whose Sum is 0(二分的力量)
- poj 2785--4 Values whose Sum is 0(折半枚举)
- makefile的使用
- 在Ubuntu16.04中设置默认Python3.5的命令
- softmax函数以及相关求导过程
- Spring AOP 一般应用场景
- C++笔记
- POJ2785 4 Values whose Sum is 0(折半枚举+二分)
- Handler和Timer实现倒计时和三秒跳转
- WIN10下配置服务器无法打开的问题
- javaSE之第一讲 成员变量.局部变量.匿名对象以及封装特性.构造函数知识点总结
- 关于游戏开发方面的科普性概述
- JDK动态代理源码及源码剖析之为什么只能代理接口
- Linux远程控制,传送文件,及文件的压缩打包的相关操作
- Android ListView 总结
- 第八周——项目三—顺序串算法