题意:

      有一个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. 容斥原理应用(求1~r中有多少个数与n互素)

    问题:求1~r中有多少个数与n互素. 对于这个问题由容斥原理,我们有3种写法,其实效率差不多.分别是:dfs,队列数组,位运算. 先说说位运算吧: 用二进制1,0来表示第几个素因子是否被用到,如m=3 ...

  2. Acdream1084 寒假安排 求n!中v因子个数

    题目链接:pid=1084">点击打开链接 寒假安排 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 128000/64000 ...

  3. Algorithm --> 求阶乘末尾0的个数

    求阶乘末尾0的个数 (1)给定一个整数N,那么N的阶乘N!末尾有多少个0?比如:N=10,N!=3628800,N!的末尾有2个0. (2)求N!的二进制表示中最低位为1的位置. 第一题 考虑哪些数相 ...

  4. Algorithm --> 求N以内的真分数个数

    求N以内的真分数个数 For example, if N = 5, the number of possible irreducible fractions are 11 as below. 0 1/ ...

  5. 谷歌面试题:输入是两个整数数组,他们任意两个数的和又可以组成一个数组,求这个和中前k个数怎么做?

    谷歌面试题:输入是两个整数数组,他们任意两个数的和又可以组成一个数组,求这个和中前k个数怎么做? 分析: "假设两个整数数组为A和B,各有N个元素,任意两个数的和组成的数组C有N^2个元素. ...

  6. hdu 1856 求集合里元素的个数 输出最大的个数是多少

    求集合里元素的个数 输出最大的个数是多少 Sample Input41 23 45 61 641 23 45 67 8 Sample Output42 # include <iostream&g ...

  7. js判断向量叉点 并求出交点坐标

     代码如下可以直接运行,判断向量相交并求出交点坐标 <!DOCTYPE html> <html> <head> <meta http-equiv=" ...

  8. 求二叉树第K层的节点个数+求二叉树叶子节点的个数

    size_t _FindLeafSize(Node* root)     //求二叉树叶子节点的个数    {        //static size_t count = 0;        if ...

  9. 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 ...

随机推荐

  1. Java练习——String类练习

    需求: 给定一个字符串String str=" Hello World",返回长度,返回o第一次出现的索引,返回最后一个o的索引,把所有的l都替换为m,并把字符串str按空格分割为 ...

  2. PAT-1140(Look-and-say Sequence)字符串处理

    Look-and-say Sequence PAT-1140 #include<iostream> #include<cstring> #include<string&g ...

  3. POJ-2502(Dijikstra应用+最短路)

    Subway POJ-2502 这里除了直接相连的地铁站,其他图上所有的点都要连线,这里是走路的速度. 记住最后的结果需要四舍五入,否则出错. #include<iostream> #in ...

  4. CentOS7 下 MySQL 5.7.23 & XtraBackup 24 做数据备份(1)——安装软件

    在两台机子上同时操作下面的步骤 首先安装MySQL,从官网下载相对应版本的RPM包 mysql-community-client-5.7.23-1.el7.x86_64.rpm mysql-commu ...

  5. Java-for循环打印九九乘法表

    Java打印九九乘法表 public class forDemo04 { public static void main(String[] args) { //练习3:打印九九乘法表 /* 1*1=1 ...

  6. 【ZeyFraのJavaEE开发小知识03】@DateTimeFomat和@JsonFormat

    关于在Element UI的el-dialog组件中使用echarts的问题 问题描述: "Cannot read property 'getAttribute' of null" ...

  7. WPF 基础 - x 名称空间详解

    名称 种类(默认Attribute) 备注 x:Array 标记拓展 可作为 ListBox.ItemsSource 的值 x:Class 指定与 .cs 中哪个类合并,所指示的类型在声明时使用 pa ...

  8. 周期串(JAVA语言)

    package 第三章习题; /*  * 如果一个字符可以由某个长度为k的字符串重复多次得到,则称该串以k为周期.  * 例如:abcabcabcabc 以3为周期(注意:它也以6和12为周期)  * ...

  9. 系统编程-信号-信号发送kill、raise、alarm

    信号发送 kill 和 raise函数 kill函数参数详解: 实验1 raise和kill 的使用 #include <stdio.h> #include <signal.h> ...

  10. CodeForces CF877D题解(BFS+STL-set)

    解法\(1:\) 正常的\(bfs\)剪枝是\(\Theta(nm4k)\),这个时间复杂度是只加一个\(vis\)记录的剪枝的,只能保证每个点只进队一次,并不能做到其他的减少时间,所以理论上是过不了 ...