LA4851餐厅(求好的坐标的个数)
题意:
有一个m*m的格子,左下角(0,0)右上角(m-1,m-1),网格里面有两个y坐标相同的宾馆(A,B),每个宾馆里面有一个餐厅,一共用n个餐厅,第1,2个都在宾馆里,3,4...在其他位置,你现在要在空余坐标上建立一个自己的餐厅,餐厅必须建立在最有利的位置上,什么样的位置算是有利的位置?如果你要在C这二个点建立一个餐厅,假如你要比D这个餐厅的位置有利那么你到A宾馆里里面的餐厅1的距离比C到这个宾馆的近,或者是到B的也行,只要有一个比C的近,那么你的位置就比C好,如果当前点想建立餐厅,那么必须必所有的餐厅的位置都好才行,问一共多有多少个好的位置。
思路:
吭了好几个小时了,终于想出来了,对于每一个已经有的餐馆(包括第一个和第二个),他们会限制两个区域,分别是这两个区域(用右上方这个点举例):
每个点都有这样类此的以AB连线对称的两个限制区域,我们把所有区域叠加起来,最后剩下的就是可行的区域,叠加的时候也很简单,我们枚举x1--x2的所有x,Yu[x]表示x节点在AB连线上方的最小限制值,Yd[x]是下方的最大限制值,Y[x] = minn(Yu[x] - y ,Yd[x] - y),表示的是在x这个点的这一竖列的最大非限制距离,然后就是简单更新,具体细节看下面代码。
#include<stdio.h>
#define N 66000
#define INF 100000000
int maxx(int x ,int y)
{
return x > y ? x : y;
}
int minn(int x ,int y)
{
return x < y ? x : y;
}
int Yu[N] ,Yd[N] ,Y[N];
int main ()
{
int t ,n ,m ,i ,x ,y ,x1 ,x2 ,y1 ,y2;
scanf("%d" ,&t);
while(t--)
{
scanf("%d %d" ,&m ,&n);
scanf("%d %d" ,&x1 ,&y1);
scanf("%d %d" ,&x2 ,&y2);
if(x1 > x2) x = x1 ,x1 = x2 ,x2 = x;
for(i = x1 ;i <= x2 ;i ++)
Yd[i] = -INF ,Yu[i] = INF;
for(i = 3 ;i <= n ;i ++)
{
scanf("%d %d" ,&x ,&y);
if(y >= y1) Yu[x] = minn(Yu[x] ,y);
if(y <= y1) Yd[x] = maxx(Yd[x] ,y);
}
Y[x1] = Y[x2] = 0;
for(i = x1 + 1 ;i < x2 ;i ++)
Y[i] = minn(Yu[i] - y1 ,y1 - Yd[i]);
for(i = x1 + 1 ;i < x2 ;i ++)
Y[i] = minn(Y[i-1] + 1 ,Y[i]);
for(i = x2 - 1 ;i > x1 ;i --)
Y[i] = minn(Y[i+1] + 1 ,Y[i]);
long long Ans = 0;
for(i = x1 + 1 ;i < x2 ;i ++)
{
if(Y[i])
{
Ans ++;
Ans += (long long)minn(m - 1 - y1 ,Y[i] - 1);//防止出现INF
Ans += (long long)minn(Y[i] - 1,y1);//防止出现INF
}
}
printf("%lld\n" ,Ans);
}
return 0;
}
LA4851餐厅(求好的坐标的个数)的更多相关文章
- 容斥原理应用(求1~r中有多少个数与n互素)
问题:求1~r中有多少个数与n互素. 对于这个问题由容斥原理,我们有3种写法,其实效率差不多.分别是:dfs,队列数组,位运算. 先说说位运算吧: 用二进制1,0来表示第几个素因子是否被用到,如m=3 ...
- Acdream1084 寒假安排 求n!中v因子个数
题目链接:pid=1084">点击打开链接 寒假安排 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 128000/64000 ...
- Algorithm --> 求阶乘末尾0的个数
求阶乘末尾0的个数 (1)给定一个整数N,那么N的阶乘N!末尾有多少个0?比如:N=10,N!=3628800,N!的末尾有2个0. (2)求N!的二进制表示中最低位为1的位置. 第一题 考虑哪些数相 ...
- Algorithm --> 求N以内的真分数个数
求N以内的真分数个数 For example, if N = 5, the number of possible irreducible fractions are 11 as below. 0 1/ ...
- 谷歌面试题:输入是两个整数数组,他们任意两个数的和又可以组成一个数组,求这个和中前k个数怎么做?
谷歌面试题:输入是两个整数数组,他们任意两个数的和又可以组成一个数组,求这个和中前k个数怎么做? 分析: "假设两个整数数组为A和B,各有N个元素,任意两个数的和组成的数组C有N^2个元素. ...
- hdu 1856 求集合里元素的个数 输出最大的个数是多少
求集合里元素的个数 输出最大的个数是多少 Sample Input41 23 45 61 641 23 45 67 8 Sample Output42 # include <iostream&g ...
- js判断向量叉点 并求出交点坐标
代码如下可以直接运行,判断向量相交并求出交点坐标 <!DOCTYPE html> <html> <head> <meta http-equiv=" ...
- 求二叉树第K层的节点个数+求二叉树叶子节点的个数
size_t _FindLeafSize(Node* root) //求二叉树叶子节点的个数 { //static size_t count = 0; if ...
- Codeforces Round #467 (Div. 2) A. Olympiad[输入一组数,求该数列合法的子集个数]
A. Olympiad time limit per test 1 second memory limit per test 256 megabytes input standard input ou ...
随机推荐
- phpMyAdmin Transformation 任意文件包含/远程代码执行漏洞
漏洞参考 https://yq.aliyun.com/articles/679633 国外提供了一个在线测试的靶场 默认密码 root toor https://www.vsplate.c ...
- 《Asp.Net Core3 + Vue3入坑教程》 - Vue 1.使用vue-cli创建vue项目
简介 <Asp.Net Core3 + Vue3入坑教程> 此教程适合新手入门或者前后端分离尝试者.可以根据图文一步一步进操作编码也可以选择直接查看源码.每一篇文章都有对应的源码 目录 & ...
- 线上MySQL读写分离,出现写完读不到问题如何解决
大家好,我是历小冰. 今天我们来详细了解一下主从同步延迟时读写分离发生写后读不到的问题,依次讲解问题出现的原因,解决策略以及 Sharding-jdbc.MyCat 和 MaxScale 等开源数据库 ...
- jdk 集合大家族之Map
jdk 集合大家族之Map 前言: 之前章节复习了Collection接口相关,此次我们来一起回顾一下Map相关 .本文基于jdk1.8. 1. HashMap 1.1 概述 HashMap相对于Li ...
- 翻译:《实用的Python编程》04_03_Special_methods
目录 | 上一节 (4.2 继承) | 下一节 (4.4 异常) 4.3 特殊方法 可以通过特殊方法(或者称为"魔术"方法(magic method))自定义 Python 行为的 ...
- FreeBSD WIFI 配置
ee /boot/ loader.conf ee是个编辑器 中写入 rtwn_usb_load="YES" legal.realtek.license_ack=1 在 /etc/ ...
- Spring Boot 启动过程
一切从SpringApplication.run()开始,最终返回一个ConfigurableApplicationContext 构造了一个SpringApplication对象,然后调用它的run ...
- 使用jhipster 加速java web开发
jhipster,中文释义: Java 热爱者! JHipster is a development platform to quickly generate, develop, & depl ...
- 阿里二面:什么是mmap?
平时在面试中你肯定会经常碰见的问题就是:RocketMQ为什么快?Kafka为什么快?什么是mmap? 这一类的问题都逃不过的一个点就是零拷贝,虽然还有一些其他的原因,但是今天我们的话题主要就是零拷贝 ...
- 数据调度组件:基于Azkaban协调时序任务执行
一.Azkaban概述 1.任务时序 在数据服务的业务场景中,很常见的业务流程就是日志文件经过大数据分析,再向业务输出结果数据:在该过程中会有很多任务需要执行,并且很难精准把握任务执行的结束时间,但是 ...