链接:

https://www.acwing.com/problem/content/123/

题意:

农夫约翰希望为他的奶牛们建立一个畜栏。

这些挑剔的畜生要求畜栏必须是正方形的,而且至少要包含C单位的三叶草,来当做它们的下午茶。

畜栏的边缘必须与X,Y轴平行。

约翰的土地里一共包含N单位的三叶草,每单位三叶草位于一个1 x 1的土地区域内,区域位置由其左下角坐标表示,并且区域左下角的X,Y坐标都为整数,范围在1到10000以内。

多个单位的三叶草可能会位于同一个1 x 1的区域内,因为这个原因,在接下来的输入中,同一个区域坐标可能出现多次。

只有一个区域完全位于修好的畜栏之中,才认为这个区域内的三叶草在畜栏之中。

请你帮约翰计算一下,能包含至少C单位面积三叶草的情况下,畜栏的最小边长是多少。

思路:

离散化之后搞一下二维前缀和.再查询就可以降到500^2*log(1000)左右.

代码:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. struct Node
  4. {
  5. int x, y;
  6. int node;
  7. }node[510];
  8. int Map[10000][10000];
  9. int Number[2010];
  10. int c, n, pos;
  11. bool Check(int len)
  12. {
  13. for (int x1 = 1, x2 = 1;x2 <= pos;x2++)
  14. {
  15. while (Number[x2]-Number[x1]+1 > len)
  16. x1++;
  17. for (int y1 = 1, y2 = 1;y2 <= pos;y2++)
  18. {
  19. while (Number[y2]-Number[y1]+1 > len)
  20. y1++;
  21. if (Map[x2][y2]-Map[x2][y1-1]-Map[x1-1][y2]+Map[x1-1][y1-1] >= c)
  22. return true;
  23. }
  24. }
  25. return false;
  26. }
  27. int main()
  28. {
  29. scanf("%d %d", &c, &n);
  30. int x, y;
  31. pos = 0;
  32. for (int i = 1;i <= n;i++)
  33. {
  34. scanf("%d%d", &node[i].x, &node[i].y);
  35. Number[++pos] = node[i].x;
  36. Number[++pos] = node[i].y;
  37. }
  38. sort(Number+1, Number+1+2*n);
  39. pos = unique(Number+1, Number+1+2*n)-(Number+1);
  40. for (int i = 1;i <= n;i++)
  41. {
  42. node[i].x = lower_bound(Number+1, Number+1+pos, node[i].x)-Number;
  43. node[i].y = lower_bound(Number+1, Number+1+pos, node[i].y)-Number;
  44. Map[node[i].x][node[i].y]++;
  45. }
  46. for (int i = 1;i <= pos;i++)
  47. {
  48. for (int j = 1;j <= pos;j++)
  49. Map[i][j] = Map[i][j]+Map[i-1][j]+Map[i][j-1]-Map[i-1][j-1];
  50. }
  51. int l = 1, r = 10000;
  52. int res = 10000;
  53. while (l < r)
  54. {
  55. // cout << l << ' ' << r << endl;
  56. int mid = (l+r)/2;
  57. if (Check(mid))
  58. {
  59. r = mid;
  60. }
  61. else
  62. l = mid+1;
  63. }
  64. // cout << r << endl;
  65. printf("%d\n", r);
  66. return 0;
  67. }
  68. /*
  69. 9 9
  70. 1 1
  71. 1 2
  72. 1 3
  73. 2 1
  74. 2 2
  75. 2 3
  76. 3 1
  77. 3 2
  78. 1000 1000
  79. */

Acwing-121-赶牛入圈(二分, 二维前缀和,离散化)的更多相关文章

  1. poj_3179 Corral the Cows (二分+二维前缀和+离散化)

    [题目链接] http://poj.org/problem?id=3179 [参考] http://www.cnblogs.com/evenbao/p/9243183.html [算法] 二分答案+判 ...

  2. Gym 102091L Largest Allowed Area 【二分+二维前缀和】

    <题目链接> 题目大意:给你一个由01组成的矩形,现在问你,该矩形中,最多只含一个1的正方形的边长最长是多少. 解题分析: 用二维前缀和维护一下矩形的01值,便于后面直接$O(1)$查询任 ...

  3. cf1073c 二分+二维前缀和

    #include<bits/stdc++.h> using namespace std; #define maxn 200005 char s[maxn]; ][maxn]; map< ...

  4. [BZOJ2738]矩阵乘法(整体二分+二维树状数组)

    整体二分+二维树状数组. 好题啊!写了一个来小时. 一看这道题,主席树不会搞,只能用离线的做法了. 整体二分真是个好东西,啥都可以搞,尤其是区间第 \(k\) 大这种东西. 我们二分答案,然后用二维树 ...

  5. 【bzoj2738】矩阵乘法 整体二分+二维树状数组

    题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入 第一行两个数N,Q,表示矩阵大小和询问组数:接下来N行N列一共N*N个数,表示这个矩阵:再接下来Q行每行5个数 ...

  6. Codeforces 1262E Arson In Berland Forest(二维前缀和+二维差分+二分)

     题意是需要求最大的扩散时间,最后输出的是一开始的火源点,那么我们比较容易想到的是二分找最大值,但是我们在这满足这样的点的时候可以发现,在当前扩散时间k下,以这个点为中心的(2k+1)2的正方形块内必 ...

  7. [CSP-S模拟测试]:physics(二维前缀和+二分+剪枝)

    题目传送门(内部题26) 输入格式 第一行有$3$个整数$n,m,q$.然后有$n$行,每行有一个长度为$m$的字符串,$+$表示正电粒子,$-$表示负电粒子.然后有$q$行,每行$2$个整数$x,y ...

  8. C - Monitor CodeForces - 846D (二维前缀和 + 二分)

    Recently Luba bought a monitor. Monitor is a rectangular matrix of size n × m. But then she started ...

  9. 【AcWing 99】激光炸弹——二维前缀和

    (题面来自AcWing) 一种新型的激光炸弹,可以摧毁一个边长为 R 的正方形内的所有的目标. 现在地图上有 N 个目标,用整数Xi,Yi表示目标在地图上的位置,每个目标都有一个价值Wi. 激光炸弹的 ...

随机推荐

  1. URLOS开发基础教程——docker容器的使用方法

    URLOS本是基于docker容器运行,在入门URLOS开发之前,我们首先需要掌握docker的相关基础知识,本篇就以docker容器的基本使用方法为例,快速的让大家对docker有一个全面的印象. ...

  2. comodo firewall 科莫多离线安装

    comodo firewall是什么?他配有HIPS,配置好规则就可以比杀软强不是一个两个档次,但是新手不建议使用. 注意:不用使用疯狂模式后锁屏,不然系统都打不开. 下载地址: https://do ...

  3. C++学习笔记-多态

    多态作为面向对象的重要概念,在如何一门面向对象编程语言中都有着举足轻重的作用,学习多态,有助于更好地理多态的行为 多态性(Polymorphism)是指一个名字,多种语义:或界面相同,多种实现. 重载 ...

  4. [转帖]IntelliJ IDEA 2018.3.3破解方法

    IntelliJ IDEA 2018.3.3破解方法 https://blog.csdn.net/qq_42862882/article/details/86477495 验证了下 也可以激活.   ...

  5. Github 添加公匙 出错 (我真傻 真的)

    网上一搜一箩筐 之前配了很多次都没问题 重装系统后配了半天总是提示 github Key is invalid. You must supply a key in OpenSSH public key ...

  6. 2019HDU多校赛第二场 H HDU 6598 Harmonious Army(最小割模型)

    参考博客https://blog.csdn.net/u013534123/article/details/97142191 #include<bits/stdc++.h> using na ...

  7. 手写一个python迭代器

    分析 我们都知道一个可迭代对象可以通过iter()可以返回一个迭代器. 如果想要一个对象称为可迭代对象,即可以使用for,那么必须实现__iter __()方法. 在一个类的实例对象想要变成迭代器,就 ...

  8. 网络信息统计netstat|ss|ip

    1:netstate[弃用] netstat的作用: 需求 原命令 新命令 1:网络连接 netstat -a ss 2:路由表 netstat -r ip route 3:统计接口 netstat ...

  9. Auto-increment 自动增长

    Auto-increment 会在新记录插入表中时生成一个唯一的数字. AUTO INCREMENT 字段 我们通常希望在每次插入新记录时,自动地创建主键字段的值. 我们可以在表中创建一个 auto- ...

  10. 利用yaml文件管理资源

    利用yaml配置文件管理资源 [root@master ~]# cat nginx-deployment.yaml apiVersion: apps/v1beta2 kind: Deployment ...