题目大意:给定n行数(n<=4000),每行4个数。从这4列中,每列选择一个数使其和为0

暴力枚举 O(n^4)会tle。
优化:枚举第1,2列算出总和s1[],枚举第3,4列算出总和s2[]。然后枚举s1[],在s2[]中二分查找等于-s1[]的数即可 O(n^2log(n^2))

第一次WA:没有认识到,s2[]数组中有相同的数,所以找到一个就++ans。
正解:在s2[]中找到第一个>key的位置pos1,再找到第一个>=key的位置pos2,则ans+=(pos1-pos2);

#include <cstdio>
#include <algorithm>using namespace std;
const int N = 4e3+5;
const int M = 16e6+5;
int a[5][N];
int s1[M],s2[M];
int n;int upper_find(int l, int r, int key)
{while(l<=r){int mid = (l+r)>>1;if(s2[mid]>key) r = mid-1;else l = mid+1;}return r+1;
}int lower_find(int l, int r, int key)
{while(l<=r){int mid = (l+r)>>1;if(s2[mid]>=key) r = mid-1;else l = mid+1;}return r+1;
}int main()
{scanf("%d", &n);for(int i = 1; i <= n; ++i)scanf("%d %d %d %d", &a[1][i], &a[2][i], &a[3][i], &a[4][i]);int tot = 0;for(int i = 1; i <= n; ++i)for(int j = 1; j <= n; ++j)s1[++tot] = a[1][i]+a[2][j];tot = 0;for(int i = 1; i <= n; ++i)for(int j = 1; j <= n; ++j)s2[++tot] = a[3][i]+a[4][j];int ans = 0;sort(s2+1, s2+tot+1);for(int i = 1; i <= tot; ++i)ans += upper_find(1, tot, -s1[i])-lower_find(1, tot, -s1[i]);printf("%d\n", ans);return 0;
}

poj2785 二分查找相关推荐

  1. poj2785 二分查找

    输入n,表示a b c d 四个集合都有n个元素.之后每行输入4个集合中的一个元素.求这四个集合每个集合中拿出一个数相加等于0的组数. 思路 如果直接搜,复杂度为O(N^3),时间不满足要求.  折半 ...

  2. 算法图解/二分查找/简单查找/选择排序/递归算法/快速排序算法/

    大 O 表示法 大 O 表示法在讨论运行时间时,log 指的都是 log2 大 O 表示法指出了算法有多快,让你能够比较操作数,它指出了算法运行时间的增速,而并非以秒为单位的速度. 大 O 表示法指出 ...

  3. LeetCode简单题之二分查找

    题目 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1. 示例 1: 输入: n ...

  4. 二分查找模板全面总结

    二分查找 二分法的引入 情形1 1.X的平方根 2.搜索旋转排序数组 情形2 1.第一个错误的版本 2.寻找峰值 3.寻找旋转排序数组中的最小值 情形3 在排序数组中查找第一个和最后一个位置 当遇到查 ...

  5. 数据结构与算法(8-2)有序表查找(折半查找(二分查找)、插值查找)

    目录 一.折半查找(二分查找) 二.插值查找 总代码 一.折半查找(二分查找) 原理:一次次折半,不断向着查找值的位置靠近 . 适用场景:有序(必须) 流程:开始时,min标志首,max标志尾,med ...

  6. 二分查找算法的一点改进

    在计算机科学中,二分查找,是一种在有序数组中查找某一特定元素的搜索算法.这种搜索算法每一次比较都使搜索范围减半.第一篇二分查找的论文发表于1946年,然而第一个没有bug的二分查找算法却是在1962年 ...

  7. 二分法:二分查找(递归+非递归)实现

    二分查找又称折半查找,首先,假设表中元素是按升序排列,将 表中间位置的关键字与查找关键字比较: 如果两者相等,则查找成功; 否则利用中间位置将表分成前.后两个子表: 1)如果中间位置的关键字大于查找关 ...

  8. python数据结构与算法:二分查找

    二分查找:python 实现 def binary_seaech(alist,item):"""二分查找 递归实现"""n = len(al ...

  9. 【C++】C++11 STL算法(四):二分查找法(Binary search operations)、合并操作

    目录 一.lower_bound 1.原型: 2.说明: 3.官方demo 二.upper_bound 1.原型: 2.说明: 3.官方demo 三.binary_search 1.原型: 2.说明: ...

最新文章

  1. Python+selenium 自动化-读取excel记录的脚本执行登陆操作实战演示
  2. 如何挂载阿里云Linux服务器的“数据盘”(新购买)
  3. 省赛组队赛3 比赛总结
  4. 查看网络端口使用情况
  5. matlab人工势场法三维演示图,运动规划入门 | 5. 白话人工势场法,从原理到Matlab实现...
  6. c语言最大公约数和最小公倍数_五年级奥数课堂之七:公因数和公倍数
  7. Python3条件判断
  8. C语言的inline
  9. 唯快不破:Web 应用的 13 个优化步骤
  10. [原创]一个shell小案例
  11. Spring的核心思想,这篇文章短小精悍的总结透了
  12. 基础集合论 第二章 9 族
  13. 基于java的电子政务网的设计及开发
  14. android 触摸屏校准软件,触摸屏软件(eGalaxTouch)下载_触摸屏软件(eGalaxTouch)官方下载-太平洋下载中心...
  15. python检测图像中的矩形_详解利用OpenCV提取图像中的矩形区域(PPT屏幕等)
  16. mysql筛选两个不同表的数据
  17. 含有一般疑问句的歌_七年级——一般现在时
  18. --------------------------------------MYSQL批量修改字段类型---------------------------------
  19. JETSON TX2烧写系统
  20. C#之父Anders Hejlsberg演讲解读:编程语言大趋势

热门文章

  1. 求反向互补字符串长度
  2. 常用的空间形状相似性计算方法有哪些,它们之间有什么不同
  3. vue移动组件vant官网打不开的解决方法
  4. java和php哪个容易学?
  5. u盘里装linux系统软件,手把手教你在U盘里面安装一个LINUX系统
  6. 致准大一新生:上大学前,你需要知道的几件事
  7. 让你在Windows打开Sketch格式再也不愁
  8. MATLAB 自然样条函数(Spline,非MATLAB内置函数)
  9. 虚幻与Unity引擎 之 ✨ 为什么国内那么多开发者喜欢用虚幻或者Unity?
  10. GHMC_Loss pytorch实现