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 ...
随机推荐
- Hi3559AV100-自己编译了u-boot、kernel及rootfs后,出现烧写错误或者烧写后板载无法启动的解决思路
这篇随笔主要给出了Hi3559AV100-自己编译了u-boot.kernel及rootfs后,出现烧写错误或者烧写后板载无法启动的解决思路. 问题 (1)对于 u-boot 为官方的,kernel ...
- MySql_176. 第二高的薪水 + limit + distinct + null
MySql_176. 第二高的薪水 LeetCode_MySql_176 题目描述 题解分析 代码实现 # Write your MySQL query statement below select( ...
- js导出execl 兼容ie Chrome Firefox各种主流浏览器(js export execl)
第一种导出table布局的表格 1 <html> 2 3 <head> 4 <meta charset="utf-8"> 5 <scrip ...
- Reincarnation Without New Body(RWNB): Basic Theory and Baseline 现世转生基本理论及简单操作
Abstract 投胎学是一门高深的学问,不仅没有现存的理论,也没有过往的经验.根据种种猜测,投胎后前世的记忆也不能保留,造成了很大的不方便.在本文中,我们绕过了投胎需要"来世"的 ...
- linux_MYSQL 数据库自动备份并压缩和删除历史备份
1. 创建shell脚本 #! /bin/bash# MySQL用户user="root"# MySQL密码userPWD="123456789"# 需要定时备 ...
- FreeBSD 乃至开源界中的孔乙己 再论苦难哲学之一
在许多狂热的FreeBSD 粉丝里,他们甚至不允许别人把FreeBSD写作freebsd,要和你强调,F和BSD都是大写的.还说这是什么尊重之类的东西.大抵和孔乙己的茴香豆的茴的有四种写法一样吧:&q ...
- 设计模式之建造者模式(BuilderPattern)
一.意义 将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 说明:复杂对象的构建,比如一个对象有几十个成员属性,那么我们在创建这个对象,并给成员属性赋值时,就会很麻烦.采用 ...
- 《进击吧!Blazor!》系列入门教程 第一章 7.图表
<进击吧!Blazor!>是本人与张善友老师合作的Blazor零基础入门教程视频,此教程能让一个从未接触过Blazor的程序员掌握开发Blazor应用的能力. 视频地址:https://s ...
- gtk+2.0中函数set_widget_font_size()函数在编译时未定义的解决办法
自己写一个头文件即可,代码如下: 在.c文件中包含该头文件即可
- 如何动态生成EasyUI的表头
需求 前几天遇到了这样一个需求,在页面上展示一组数据,但是表头不固定,需要动态加载出来.比如这次查询表头有[姓名][年龄],可能下次查询表头就变成了[姓名][年龄][性别]. 思路简介 我刚刚接手这个 ...