Acwing-121-赶牛入圈(二分, 二维前缀和,离散化)
链接:
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)左右.
代码:
#include <bits/stdc++.h>
using namespace std;
struct Node
{
int x, y;
int node;
}node[510];
int Map[10000][10000];
int Number[2010];
int c, n, pos;
bool Check(int len)
{
for (int x1 = 1, x2 = 1;x2 <= pos;x2++)
{
while (Number[x2]-Number[x1]+1 > len)
x1++;
for (int y1 = 1, y2 = 1;y2 <= pos;y2++)
{
while (Number[y2]-Number[y1]+1 > len)
y1++;
if (Map[x2][y2]-Map[x2][y1-1]-Map[x1-1][y2]+Map[x1-1][y1-1] >= c)
return true;
}
}
return false;
}
int main()
{
scanf("%d %d", &c, &n);
int x, y;
pos = 0;
for (int i = 1;i <= n;i++)
{
scanf("%d%d", &node[i].x, &node[i].y);
Number[++pos] = node[i].x;
Number[++pos] = node[i].y;
}
sort(Number+1, Number+1+2*n);
pos = unique(Number+1, Number+1+2*n)-(Number+1);
for (int i = 1;i <= n;i++)
{
node[i].x = lower_bound(Number+1, Number+1+pos, node[i].x)-Number;
node[i].y = lower_bound(Number+1, Number+1+pos, node[i].y)-Number;
Map[node[i].x][node[i].y]++;
}
for (int i = 1;i <= pos;i++)
{
for (int j = 1;j <= pos;j++)
Map[i][j] = Map[i][j]+Map[i-1][j]+Map[i][j-1]-Map[i-1][j-1];
}
int l = 1, r = 10000;
int res = 10000;
while (l < r)
{
// cout << l << ' ' << r << endl;
int mid = (l+r)/2;
if (Check(mid))
{
r = mid;
}
else
l = mid+1;
}
// cout << r << endl;
printf("%d\n", r);
return 0;
}
/*
9 9
1 1
1 2
1 3
2 1
2 2
2 3
3 1
3 2
1000 1000
*/
Acwing-121-赶牛入圈(二分, 二维前缀和,离散化)的更多相关文章
- poj_3179 Corral the Cows (二分+二维前缀和+离散化)
[题目链接] http://poj.org/problem?id=3179 [参考] http://www.cnblogs.com/evenbao/p/9243183.html [算法] 二分答案+判 ...
- Gym 102091L Largest Allowed Area 【二分+二维前缀和】
<题目链接> 题目大意:给你一个由01组成的矩形,现在问你,该矩形中,最多只含一个1的正方形的边长最长是多少. 解题分析: 用二维前缀和维护一下矩形的01值,便于后面直接$O(1)$查询任 ...
- cf1073c 二分+二维前缀和
#include<bits/stdc++.h> using namespace std; #define maxn 200005 char s[maxn]; ][maxn]; map< ...
- [BZOJ2738]矩阵乘法(整体二分+二维树状数组)
整体二分+二维树状数组. 好题啊!写了一个来小时. 一看这道题,主席树不会搞,只能用离线的做法了. 整体二分真是个好东西,啥都可以搞,尤其是区间第 \(k\) 大这种东西. 我们二分答案,然后用二维树 ...
- 【bzoj2738】矩阵乘法 整体二分+二维树状数组
题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入 第一行两个数N,Q,表示矩阵大小和询问组数:接下来N行N列一共N*N个数,表示这个矩阵:再接下来Q行每行5个数 ...
- Codeforces 1262E Arson In Berland Forest(二维前缀和+二维差分+二分)
题意是需要求最大的扩散时间,最后输出的是一开始的火源点,那么我们比较容易想到的是二分找最大值,但是我们在这满足这样的点的时候可以发现,在当前扩散时间k下,以这个点为中心的(2k+1)2的正方形块内必 ...
- [CSP-S模拟测试]:physics(二维前缀和+二分+剪枝)
题目传送门(内部题26) 输入格式 第一行有$3$个整数$n,m,q$.然后有$n$行,每行有一个长度为$m$的字符串,$+$表示正电粒子,$-$表示负电粒子.然后有$q$行,每行$2$个整数$x,y ...
- C - Monitor CodeForces - 846D (二维前缀和 + 二分)
Recently Luba bought a monitor. Monitor is a rectangular matrix of size n × m. But then she started ...
- 【AcWing 99】激光炸弹——二维前缀和
(题面来自AcWing) 一种新型的激光炸弹,可以摧毁一个边长为 R 的正方形内的所有的目标. 现在地图上有 N 个目标,用整数Xi,Yi表示目标在地图上的位置,每个目标都有一个价值Wi. 激光炸弹的 ...
随机推荐
- 解析之IIS解析
- Redhat更换Centos源
redhat默认自带的yum源需要注册,才能更新,报错: This system is not registered to Red Hat Subscription Management. You c ...
- 【转贴】bat脚本基础教程
bat脚本基础教程 https://www.cnblogs.com/linyfeng/p/8072002.html 自己动手太少了. bat脚本就是DOS批处理脚本,就是将一系列DOS命令按照一定顺序 ...
- 接口自动化框架 - httprunner 引用unittest
httprunner其中一个比较好的点就是利用type动态创建类,使用setattr动态增加方法和属性. 将维护的用例进行转变为继承unittest.Textcase的类,很好的与unittest结合 ...
- python list pop()方法
#pop()用于移除列表中的一个元素(默认是最后一个元素,并且返回该元素的值) list1=['Google','Runoob','Taobao'] list_pop=list1.pop() prin ...
- Oracle网络相关概念与常用配置文件
监听器(Listener) 监听器是Oracle基于服务端的一种网络服务,主要用于监听客户端向数据库服务器提出的链接请求. 本地服务名(Tnsname) Oracle客户端与服务器端的链接是通过客户端 ...
- hive自定义udaf函数
自定义udaf函数的代码框架 //首先继承一个类AbstractGenericUDAFResolver,然后实现里面的getevaluate方法 public GenericUDAFEvaluator ...
- 【Vue高级知识】细谈Vue 中三要素(响应式+模板+render函数)
[Vue高级知识]细谈Vue 中三要素(响应式+模板+render函数):https://blog.csdn.net/m0_37981569/article/details/93304809
- 面试40-一个数组,有2个数字出现奇数次,其余都是偶数次,求这两个数字O(n) O(1)
#include<iostream> using namespace std; // 题目:数组中只有不多于两个数字出现次数是奇数次,其他都是偶数次,求出出现奇数次的数字(不含0的数组) ...
- python_0基础开始_day12
第十二节 一,生成器 生成器的核心:生成器的本质就是迭代器 迭代器是python自带的 生成器是程序员自己写的一种迭代器 在python中有三种方式来创建生成器: 基于函数编写 推导式方式编写 pyt ...