UESTC_秋实大哥下棋 2015 UESTC Training for Data StructuresProblem I

I - 秋实大哥下棋

Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)
Submit Status

胜负胸中料已明,又从堂上出奇兵。秋实大哥是一个下棋好手,独孤求败的他觉得下棋已经无法满足他了,他开始研究一种新的玩法。

在一个n×m的棋盘上,放置了k个车,并且他在棋盘上标出了q个矩形,表示矩形内部是战略要地。

秋实大哥要求一个矩形内的每一个格子,都至少能被一辆在矩形内的车攻击到,那么这个矩形就是被完整保护的。

现在秋实大哥想知道每一个矩形是否被完整保护。

Input

第一行包含四个整数nmkq,表示棋盘的大小,车的数量以及矩形的数量。

接来下k行,每行包含两个整数xy,表示有一辆车位于从左往右第x列,从下往上第y行。

接下来q行,每行包含四个整数x1y1x2y2,表示一个矩形的左下角和右上角坐标。

1nm1051kq21051x1x21051y1y21051x1051y105

Output

输出q行,对于每一次询问,这个矩形若被完整保护了输出"YES",否则输出"NO"。

Sample input and output

Sample InputSample Output
4 3 3 3
1 1
3 2
2 3
2 3 2 3
2 1 3 3
1 2 2 3
YES
YES
NO

Hint

样例的图形如下:

title

 

 

解题报告

1.如果一个矩形能被完整保护,肯定在矩形的宽 or 长上的车的投影是一段连续的曲线且全部被覆盖.

2.首先先给矩形排个序(按照X2的大小),还有车(X坐标)

3.之后我们先考虑这些矩形能否在Y方向达成(被覆盖),注意到X,Y的范围皆为1e5,所以不必采用离散化,从左往右边扫,遇到车就把它所对的Y的方向线段加上一个值val.

注意到这个加的值是必须考究的,首先我们想因为矩形的X2坐标是递增的,一个在前面的车在Y方向的效果是必须被后面所抵消的(很显然,前面车对Y方向的影响是没有用的,因为前面的车很可能已经在后面的矩形外了)

因此我们必须维护这个车在Y方向投影值的max,有了这个还不够,我们还不知道这个val值如何计算,才能使得我们能快速计算这个矩形的Y方向被覆盖(注意到很有可能这个线段

上的某一个部分是前面的车所产生的。。因此为了判断正确,我们必须设计好这个val值)

4.

以下为例子: ( x为车 )

 

3 . . . x .

2 x . . . .

1 . . . . . 

0 1 2 3 4 5

 

我们考虑左下角坐标为(2,2) ,右上角坐标为(4,3) 的矩形,我们从左往右扫

首先遇到了车(1,2),我们给Y方向的(2,2)加上一个值 value1;

之后我们扫到了另外一个车和矩形,那么我们该处理谁呢?,显然是车

该车的坐标为(4,3),我们给Y方向的(3,3)加上一个值 value2;

之后扫到矩形的右边,矩形的Y方向为(2,3),我们在(2,3)方向的值为value1与value2..,那么如何才能确定呢。。。

用X值!,每个方向的投影val值为这个车的X值,并且维护这个最大值,这样我们就可以判断了。why?

当我们判断[L1,L2]上时,我们只查询这里面的最小值,如果这里面的最小值小于了矩形的X1,那么这个矩形肯定在Y方向没法被完全保护..

 

至此,就解决了本题. 

 

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>using namespace std;
const int maxn = 2e5 + 5000;
int n,m,k,q;
typedef struct Node
{int l,r,min;    
};typedef struct Area
{int x1,x2,y1,y2,id;friend bool operator < (const Area&a,const Area& b){return a.x2 < b.x2;}
};typedef struct Point
{int x,y;friend bool operator < (const Point &a,const Point & b){return a.x < b.x;}
}; //bool protect[maxn]; //矩形保护 
Node  tree[4*maxn];
Area  s[maxn];
Point p[maxn];void push_up(int cur)
{tree[cur].min = min(tree[2*cur].min , tree[2*cur+1].min );
}
// 把点pos的权值设置为v(取较大) 
void updata(int pos,int v,int cur)
{int l = tree[cur].l , r = tree[cur].r; if (l == r){tree[cur].min = max(tree[cur].min,v);}else{int mid = l + (r-l)/2;if (mid >= pos)updata(pos,v,2*cur);elseupdata(pos,v,2*cur+1);push_up(cur);}
}int query(int ql,int qr,int cur)
{int l = tree[cur].l , r = tree[cur].r;if (ql <= l && qr >= r)return tree[cur].min;else{int mid = l + (r-l)/2;int res = 1 << 28;if (mid >= ql)res = min(res,query(ql,qr,2*cur));if (mid < qr)res = min(res,query(ql,qr,2*cur+1));return res;}
}void build_tree(int cur,int l ,int r)
{tree[cur].l = l , tree[cur].r = r , tree[cur].min = -1;if (r > l){int mid = l + (r-l)/2;build_tree(2*cur,l,mid);build_tree(2*cur+1,mid+1,r);}}int main(int argc,char *argv[])
{scanf("%d%d%d%d",&n,&m,&k,&q);build_tree(1,1,max(n,m)+50);for(int i = 0 ; i < k ; ++ i){int x,y;scanf("%d%d",&x,&y);p[i].x = x , p[i].y = y;}memset(protect,false,sizeof(protect));for (int i = 0 ; i < q ; ++ i){scanf("%d%d%d%d",&s[i].x1,&s[i].y1,&s[i].x2,&s[i].y2);s[i].id = i;}sort(p,p+k);sort(s,s+q);int k1 = 0 , k2 = 0 ; // 记录目前在线右边边的车,矩形 for(int i = 1 ; i <= n ; ++ i)  //扫描线 
   {while(k1 < k && p[k1].x <= i) // 车更新
          {updata(p[k1].y,p[k1].x,1);k1++;}while(k2 < q && s[k2].x2 <= i) // 矩形更新 
          {int minx = query(s[k2].y1,s[k2].y2,1);if (minx >= s[k2].x1 && minx <= s[k2].x2)protect[s[k2].id] = true;k2++;}}build_tree(1,1,max(n,m)+50); //reset_tree//翻转for(int i = 0 ; i < k ; ++ i)swap(p[i].x ,p[i].y);for(int i = 0 ; i < q; ++ i){swap(s[i].x1,s[i].y1);swap(s[i].x2,s[i].y2);}sort(p,p+k);sort(s,s+q);k1 = k2 = 0;for(int i = 1 ; i <= m ; ++ i)  //扫描线 
   {while(k1 < k && p[k1].x <= i) // 车更新 
          {updata(p[k1].y,p[k1].x,1);k1++;}while(k2 < q && s[k2].x2 <= i) // 矩形更新 
          {int minx = query(s[k2].y1,s[k2].y2,1);if (minx >= s[k2].x1 && minx <= s[k2].x2)protect[s[k2].id] = true;k2++;}}for(int i = 0 ; i < q ; ++ i)if (protect[i])printf("YES\n");elseprintf("NO\n");return 0;
}

 

转载于:https://www.cnblogs.com/Xiper/p/4470218.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/431848.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 6大原则_java 6大设计原则 一:观察者模式

解耦常用的模式OrderService.javaServicepublic class OrderService{AutowiredApplicationContext applicationContext ;public void saveOrder(){//1.创建订单System.out.println(“1.创建订单”)&#xff1b;OrderEvent event new OrderEvent("参数")application…

jbb是什么梗_子水是什么意思,子水命理

子水是十二地支之一&#xff0c;那么命中有子水的代表的是什么呢&#xff1f;适合什么方位呢&#xff1f;有什么喜忌吗&#xff1f;怎么分析你呢?现在金宝贝起名网为你介绍子水是什么意思,子水命理的相关文章。子水是什么意思,子水命理八字地支&#xff1a;子水是什么意思1、对…

IOS高级编程之二:IOS的数据存储与IO

一、应用程序沙盒 IOS应用程序职能在系统为该应用所分配的文件区域下读写文件&#xff0c;这个文件区域就是应用程序沙盒。所有的非代码文件如&#xff1a;图片、声音、映象等等都存放在此。 在mac中command&#xff0b;shift&#xff0b;G命令&#xff0c;然后输入users/用户名…

安卓投屏大师_苹果,安卓手机如何免费投屏?只要悄悄按下这里,便能轻松实现...

现在很多手机都有自带投屏功能&#xff0c;这样一来我们便可以将所看的视频&#xff0c;所玩的游戏投屏到电脑或电视上了&#xff0c;当然也需要这些设备支持投屏才行。一、无线投屏1、苹果手机苹果手机的投屏功能在哪里呢&#xff1f;只要打开苹果手机从下往上滑动&#xff0c…

b站电脑客户端_如何将B站的flv格式的视频转换成mp4格式

经常看到B站有精彩的视频片段&#xff0c;于是想把这些视频下载保存到电脑&#xff0c;但是发现没有下载按钮&#xff0c;是不是很悲催。有些时候想从优酷、土豆网这些视频网站下载视频&#xff0c;结果却提示要先下载视频客户端才能继续下载视频&#xff0c;运气差的话&#x…

asp.net 设置 excel alignment_教你如何用Python轻轻松松操作Excel、Word、CSV,一文就够了,赶紧码住!!!...

作者&#xff1a;奈何缘浅wyjhttps://juejin.im/post/6868073137263607821Python 操作 Excel常用工具数据处理是 Python 的一大应用场景&#xff0c;而 Excel 又是当前最流行的数据处理软件。因此用 Python 进行数据处理时&#xff0c;很容易会和 Excel 打起交道。得益于前人的…

java 页面输出一个页面_java学习之:一个完整页面输出信息的过程(以输出Doctor表中信息为例)...

最近在练习java程序&#xff0c;总结一下从数据库查询信息并输出到jsp页面的过程。主要数据处理在src.cn.javatest包下面项目预览1&#xff0c;配置项目根目录src目录下的druid.properties数据库信息(相当于一个数据库配置文件)里面的信息可以在下载druid中获得&#xff0c;只需…

[xsd学习]xsd介绍

一直以来项目中对xml格式的判断使用的都是dtd格式&#xff0c;直到最近才发现&#xff0c;不知何时都已经转为xsd来进行判断和校验&#xff0c;于是今天专门找资料看下&#xff0c;不得不说&#xff0c;对于这类资料的入门&#xff0c;w3cschool真是个不错的资料库&#xff0c;…

教学目标四个维度_【深度好文】体育教案中的教学目标与学习目标应如何表述...

体育教师大本营教学/训练/职业/成长强 烈 建 议 大 家 星 标 我 们教 学 路 上 ☆ 不 离 不 弃在以往看到的体育课的教案上&#xff0c;目标部分不是用教学目标就是用学习目标来表述&#xff0c;然而&#xff0c;这两种目标表达形式有没有本质区别&#xff1f;分别该如何表述…

java中检查性异常类_Java异常处理、java语言推崇使用检查类型异常

异常处理是java语言的重要特性之一&#xff0c;《Three Rules for effective Exception Handling》一文中是这么解释的&#xff1a;它主要帮助我们在debug的过程中解决下面的三个问题。什么出错了哪里出错了为什么出错java语言可以说是提供了过于完善的异常处理机制&#xff0c…

nodejs readfilesync 路径_Linux 磁盘多路径聚合multipath

在日常工作中我们经常遇到配置存储的多路径聚合。多路径的目的是&#xff0c;当主机HBA卡、线缆、交换机或者存储设备的控制器故障等原因造成一条物理路径失效时,服务器可以将通过此物理路径的I/O转移到其他正常的物理路径上面,应用程序不会觉察到这种改变&#xff0c;从而提高…

u 20ubuntu 安装 postfix_极力推荐和田咨询问题U型钢托盘厂家

12极力推荐和田咨询问题U型钢托盘厂家泊头市毅伽属制品有限公司坐落于河北省泊头市龙华街北4公里&#xff0c;濒临京沪、石黄高速公路以及104、307国道&#xff0c;另有廊泊路贯穿南北交通十分便利。本公司设计生产各种冷弯型钢&#xff0c;产品包括C型钢、Z型钢、U型钢、M型钢…

HTML5中lineCap端点样式遇到closePath()

定义和用法 lineCap 属性设置或返回线条末端线帽的样式。 注释&#xff1a;"round" 和 "square" 会使线条略微变长。 默认值&#xff1a;buttJavaScript 语法&#xff1a;context.lineCap"butt|round|square";属性值 值描述butt默认。向线条的每…

php鼠标悬停显示图片,鼠标滑过出现预览的大图提示效果

当鼠标滑过图片时&#xff0c;图片会出现预览的大图&#xff0c;大图下面还会有介绍文字。.aa{width:88px;height :100px;}$(function () {var x 10;var y 20;$("a.tooltip").mouseover(function (e) {this.myTitle this.title;this.title "";var imgT…

405 not allowed什么意思_二驴质问散打:为什么不救天道!面临一个亿赔款?次惑小仙女宣布与可乐分手!...

次惑小仙女发作品表示&#xff1a;对不起让你们失望了&#xff0c;慢慢也学着长大了,懂得了很多,以前每天就知道天真傻笑的玩,后来懂得了努力和加油,但是很多东西并不是大家看到的那样背后的事情谁又能知道。都认为他对我很好&#xff0c;只有自己知道&#xff0c;呵呵。有些时…

hdu.1254.推箱子(bfs + 优先队列)

推箱子 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6021 Accepted Submission(s): 1718 Problem Description推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运…

ae合成设置快捷键_怎么在ae中剪切视频?怎么在ae里裁剪视频?

ae剪切裁剪视频教程&#xff1a;零基础学AE软件影视后期必修课程-AE新建合成-羽兔网​www.yutu.cn1、启动After Effects并导入视频第一个任务是打开一个新项目&#xff0c;并将视频加载到其中。首先从主菜单中选择新的构图。然后打开构图菜单&#xff0c;选择所需的分辨率等&am…

php js获取元素id,javascript通过中文id和class获取元素的方法

以前以为html元素中的id和class等只能通过字母数字或者下划线等特殊字符命名&#xff0c;如果单存使用中文浏览器不会报错&#xff0c;但是js是获取不到的&#xff0c;但是今天逛论坛的时候发现不是这样的。代码如下&#xff1a;运行结果&#xff1a;论坛来源是这个&#xff1a…

delphi random 六位_《蒙面唱将猜猜猜》第五季将播,六位唱将率先登场

原标题&#xff1a;《蒙面唱将猜猜猜》第五季将播&#xff0c;六位唱将率先登场新京报讯(记者 刘玮)《蒙面唱将猜猜猜》第五季将于11月1日21&#xff1a;10在江苏卫视首播&#xff0c;优酷视频全网独播。第五季中&#xff0c;猜评团不仅“觊觎”各路唱将的真实身份&#xff0c;…

java中sql之count,SQL COUNT() 函数--编程学习网

COUNT() 函数返回匹配指定条件的行数。SQL COUNT(column_name) 语法COUNT(column_name) 函数返回指定列的值的数目(NULL 不计入)&#xff1a;SELECT COUNT(column_name) FROM table_name;SQL COUNT(*) 语法COUNT(*) 函数返回表中的记录数&#xff1a;SELECT COUNT(*) FROM tabl…