题目描述

约翰打算建一个围栏来圈养他的奶牛.作为最挑剔的兽类,奶牛们要求这个围栏必须是正方 形的,而且围栏里至少要有C< 500)个草场,来供应她们的午餐.
约翰的土地上共有C<=N<=500)个草场,每个草场在一块1x1的方格内,而且这个方格的 坐标不会超过10000.有时候,会有多个草场在同一个方格内,那他们的坐标就会相同.
告诉约翰,最小的围栏的边长是多少?

输入输出格式

输入格式:

Line 1: Two space-separated integers: C and N

Lines 2..N+1: Each line contains two space-separated integers that are the X,Y coordinates of a clover field.

输出格式:

Line 1: A single line with a single integer that is length of one edge of the minimum size square that contains at least C clover fields.

输入输出样例

输入样例#1:
3 4
1 2
2 1
4 1
5 2
输出样例#1:
4

说明

Explanation of the sample:

|* *

| * *

+——Below is one 4x4 solution (C’s show most of the corral’s area); many others exist.

|CCCC

|CCCC

|CCC

|C*C*

+——

【题解】

咦,我竟然是0ms跑过的最优解。。。那就发个题解总结一下。
二维双指针法的完美结合
双指针法就是令l=1,从1到n枚举右指针r,然后始终保证[l,r]的区间是满足题目要求的区间,不满足就使l++,并每次用[l,r]更新答案(感觉就是简化的单调队列)
如果坐标都是一维的,我们只用双指针法就能搞定,但是由于是二维的,所以我们要用两重双指针法(四指针法。。。)
先二分答案,分别用双指针法维护纵坐标和横坐标,具体还是看代码吧~

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<vector>
#define ll long long
#define re register
#define il inline
#define fp(i,a,b) for(re int i=a;i<=b;i++)
#define fq(i,a,b) for(re int i=a;i>=b;i--)
using namespace std;
int n,m,nx,ny;
struct field
{int x,y;
}p[505];
int rx[505],ry[505],s[505];
il bool cmp1(field a,field b)
{return a.x<b.x;
}
il bool cmp2(field a,field b)
{return a.y<b.y;
}
il bool solve(int ml)
{int i,a,b,c,d,sc,sd;a=b=0;memset(s,0,sizeof(s));while(b<n&&rx[p[b+1].x]-rx[1]+1<=ml) s[p[++b].y]++;for(;b<=n;s[p[++b].y]++){while(rx[p[b].x]-rx[p[a+1].x]+1>ml) s[p[++a].y]--;c=d=sc=sd=0;while(d<ny&&ry[d+1]-ry[1]+1<=ml) sd+=s[++d];for(;d<=ny;sd+=s[++d]){while(ry[d]-ry[c+1]+1>ml) sc+=s[++c];if(sd-sc>=m) return 1;}}return 0;
}
il int gi()
{  re int x=0;re short int t=1;re char ch=getchar();while((ch<'0'||ch>'9')&&ch!='-') ch=getchar();if(ch=='-') t=-1,ch=getchar();while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();return x*t;
}
int main()
{m=gi();n=gi();rx[0]=ry[0]=-1;fp(i,1,n) p[i].x=gi(),p[i].y=gi();sort(p+1,p+1+n,cmp2);fp(i,1,n){if(p[i].x>rx[nx]) ry[++ny]=p[i].y;p[i].y=ny;}sort(p+1,p+1+n,cmp1);fp(i,1,n){if(p[i].x>rx[nx]) rx[++nx]=p[i].x;p[i].x=nx;}int l=1,r=max(rx[nx],ry[ny]),mid;while(l<r){mid=(l+r)>>1;if(solve(mid)) r=mid;else l=mid+1;}printf("%d",r);return 0;
}

转载于:https://www.cnblogs.com/yanshannan/p/7413153.html

洛谷[USACO06JAN]把牛Corral the Cows相关推荐

  1. 洛谷P2862 [USACO06JAN]把牛Corral the Cows

    P2862 [USACO06JAN]把牛Corral the Cows 题目描述 Farmer John wishes to build a corral for his cows. Being fi ...

  2. 洛谷——P2862 [USACO06JAN]把牛Corral the Cows

    P2862 [USACO06JAN]把牛Corral the Cows 题目描述 Farmer John wishes to build a corral for his cows. Being fi ...

  3. 洛谷 P2862 [USACO06JAN]把牛Corral the Cows

    P2862 [USACO06JAN]把牛Corral the Cows 题目描述 Farmer John wishes to build a corral for his cows. Being fi ...

  4. 洛谷 P2862 [USACO06JAN]把牛Corral the Cows 解题报告

    P2862 [USACO06JAN]把牛Corral the Cows 题目描述 Farmer John wishes to build a corral for his cows. Being fi ...

  5. [luoguP2862] [USACO06JAN]把牛Corral the Cows(二分 + 乱搞)

    传送门 可以二分边长 然后另开两个数组,把x从小到大排序,把y从小到大排序 枚举x,可以得到正方形的长 枚举y,看看从这个y开始,往上能够到达多少个点,可以用类似队列来搞 其实发现算法的本质之后,x可 ...

  6. 题解 洛谷 P3069 [USACO13JAN]牛的阵容Cow Lineup

    洛谷P3069[USACO13JAN]牛的阵容CowLineup\color{#00F}{洛谷\ P3069\ [USACO13JAN]牛的阵容Cow Lineup}洛谷 P3069 [USACO13 ...

  7. 洛谷 2953 [USACO09OPEN]牛的数字游戏Cow Digit Game

    洛谷 2953  [USACO09OPEN]牛的数字游戏Cow Digit Game 题目描述 Bessie is playing a number game against Farmer John, ...

  8. 【USACO06JAN POJ3179】Corral the Cows

    POJ 洛谷 分析 离散化+前缀和+二分 这题和激光炸弹很像,但由于坐标范围较大,需要用到二分. 代码 #include <cstdio> #include <cstring> ...

  9. 洛谷 3029 [USACO11NOV]牛的阵容Cow Lineup

    https://www.luogu.org/problem/show?pid=3029 题目描述 Farmer John has hired a professional photographer t ...

最新文章

  1. 看板中的WIP限制思想
  2. Deep Learning in a Nutshell: Core Concepts
  3. Mysql 索引 n-gram分词引擎使用
  4. 3四则运算软件2016011992
  5. 漫画:如何实现大整数相加
  6. docsify搭建知识库
  7. 配置RedisTemplate、JedisPoolConfig、JedisConnectionFactory+自定义序列化 (xml+java方式)+使用...
  8. GPIO的8种工作模式
  9. 大学生 生活小技巧:利用插件(Tampermonkey )学习网课 | 查题
  10. 【埋点体系】(一)-埋点的理解
  11. 如涵定格3.4美元退市:投资人“三折”下车,成败均系张大奕一身
  12. Android手机开发
  13. linux系统添加网卡驱动,linux系统怎么安装网卡驱动
  14. 2011最牛高考作文:时间在流逝——上还是不上大学?
  15. 【基础入门题006】求身份证校验位是否正确
  16. 监控视频分发转发服务器性能,基于视频监控的分发服务器的研究与实现
  17. 《信息安全保障》一2.3 信息安全保障工作方法
  18. Android 10 恢复出厂设置和清除应用数据接口
  19. excel中使用VBA进行多工作簿或多工作表一键汇总
  20. 抖音群控软件教你如何玩转短视频营销

热门文章

  1. opencv传统分割算法总结(多边形拟合,水平投影,直线检测)
  2. android虹软人脸识别代码混淆,虹软人脸识别Android Sample Code
  3. 静态网页项目部署到云服务器上
  4. 自动化测试之MercuryTours订票系统
  5. 【SLAM学习】(二)相机原理
  6. Ubuntu的man手册中英文切换
  7. 天线接收信号、处理系统
  8. 江苏计算机一级报名公告,江苏省2021年3月全国计算机等级考试报名公告发布
  9. Linux文件系统操作与磁盘管理,Linux文件系统操作与磁盘管理
  10. 将PPT转化为长图(长截图)【Python方法】