题目描述

你的老板命令你将停车场里的车移动成他想要的样子。
停车场是一个长条矩形,宽度为w。我们以其左下角顶点为原点,坐标轴平行于矩形的边,建立直角坐标系。停车场很长,我们可以认为它一直向右边伸展到无穷远处。
车都是边平行于坐标轴的矩形,大小可能不同。你可以将车任意地平移(但不能旋转),只要他们不超出停车场的边界,且不能互相碰撞,但紧挨着是允许的(即任意时刻任两辆车的重叠面积为0)。
你知道目前各辆车的摆放位置,以及老板心中所想的位置。你需要判断是否可以办到老板的任务。

输入

第一行为一个整数t(1<=t<=20),表示测试数据数量。
对于每组测试数据,第一行两个整数n,w(1<=n<=50000,1<=w<=10^9),分别表示车的数量和停车场的宽度。
接下来n行,第i行有四个整数x1,y1,x2,y2(0<=x1,x2<=10^9,0<=y1,y2<=w),表示编号为i的车的当前位置是由x1,y1,x2,y2确定的矩形。(注意:数据有可能出现x1>x2或y1>y2)
再接下来n行,格式和意义同上,表示车的目标位置。

输出

输出t行,第i行为TAK(是)或NIE(否),表示第i组测试数据中能否按照要求进行移动。

样例输入

2
3 3
0 0 2 2
2 1 4 3
4 0 6 1
0 0 2 2
2 1 4 3
0 2 2 3
3 3
0 0 2 2
2 1 4 3
4 0 6 1
2 1 4 3
0 0 2 2
4 0 6 1

样例输出

TAK
NIE
 
发现如果一个车能停到目标位置那么只要这两个位置之间每辆车的宽度与这个车的宽度之和不大于w就行。
对于两辆车x,y如果他们当前的相对位置与目标相对位置不同(即当前是x,y,目标是y,x)那么这两个车的宽度之和就要<=w。
用树状数组维护宽度的前缀最大值每次查询前缀最大值和当前车宽度加和是否<=w即可。

#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<vector>
#include<bitset>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
struct miku
{
int a,b,c,d;
int w;
int id;
}s1[50010],s2[50010];
int v[50010];
int n,m,T;
int flag;
int pos[50010];
bool cmp(miku a,miku b)
{
if(a.a!=b.a)
{
return a.a<b.a;
}
return a.c<b.c;
}
void add(int x,int val)
{
for(int i=x;i<=n;i+=i&-i)
{
v[i]=max(v[i],val);
}
}
int ask(int x)
{
int res=0;
for(int i=x;i;i-=i&-i)
{
res=max(res,v[i]);
}
return res;
}
int main()
{
scanf("%d",&T);
while(T--)
{
flag=0;
memset(v,0,sizeof(v));
memset(pos,0,sizeof(pos));
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d%d%d%d",&s1[i].a,&s1[i].b,&s1[i].c,&s1[i].d);
if(s1[i].a>s1[i].c)
{
swap(s1[i].a,s1[i].c);
}
if(s1[i].b>s1[i].d)
{
swap(s1[i].b,s1[i].d);
}
s1[i].w=s1[i].d-s1[i].b;
s1[i].id=i;
}
for(int i=1;i<=n;i++)
{
scanf("%d%d%d%d",&s2[i].a,&s2[i].b,&s2[i].c,&s2[i].d);
if(s2[i].a>s2[i].c)
{
swap(s2[i].a,s2[i].c);
}
if(s2[i].b>s2[i].d)
{
swap(s2[i].b,s2[i].d);
}
s2[i].w=s2[i].d-s2[i].b;
s2[i].id=i;
}
sort(s1+1,s1+1+n,cmp);
sort(s2+1,s2+1+n,cmp);
for(int i=1;i<=n;i++)
{
pos[s1[i].id]=i;
}
for(int i=n;i>=1;i--)
{
if(flag==1)
{
break;
}
if(ask(pos[s2[i].id])+s2[i].w>m)
{
flag=1;
}
add(pos[s2[i].id],s2[i].w);
}
printf(flag==1?"NIE\n":"TAK\n");
} }

BZOJ3718[PA2014]Parking——树状数组的更多相关文章

  1. 2018.10.29 bzoj3718: [PA2014]Parking(树状数组)

    传送门 显然只用判断两个会相交的车会不会卡住就行了. 直接树状数组维护后缀最大值就行了. 代码: #include<bits/stdc++.h> using namespace std; ...

  2. bzoj3718 树状数组

    https://www.lydsy.com/JudgeOnline/problem.php?id=3718 有时候,要透过题面看到本质 题意 你的老板命令你将停车场里的车移动成他想要的样子.停车场是一 ...

  3. PAT甲题题解-1095. Cars on Campus(30)-(map+树状数组,或者模拟)

    题意:给出n个车辆进出校园的记录,以及k个时间点,让你回答每个时间点校园内的车辆数,最后输出在校园内停留的总时间最长的车牌号和停留时间,如果不止一个,车牌号按字典序输出. 几个注意点: 1.如果一个车 ...

  4. bzoj3718 [PA2014]Parking

    Description 你的老板命令你将停车场里的车移动成他想要的样子.停车场是一个长条矩形,宽度为w.我们以其左下角顶点为原点,坐标轴平行于矩形的边,建立直角坐标系.停车场很长,我们可以认为它一直向 ...

  5. BZOJ 1103: [POI2007]大都市meg [DFS序 树状数组]

    1103: [POI2007]大都市meg Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2221  Solved: 1179[Submit][Sta ...

  6. bzoj1878--离线+树状数组

    这题在线做很麻烦,所以我们选择离线. 首先预处理出数组next[i]表示i这个位置的颜色下一次出现的位置. 然后对与每种颜色第一次出现的位置x,将a[x]++. 将每个询问按左端点排序,再从左往右扫, ...

  7. codeforces 597C C. Subsequences(dp+树状数组)

    题目链接: C. Subsequences time limit per test 1 second memory limit per test 256 megabytes input standar ...

  8. BZOJ 2434: [Noi2011]阿狸的打字机 [AC自动机 Fail树 树状数组 DFS序]

    2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 2545  Solved: 1419[Submit][Sta ...

  9. BZOJ 3529: [Sdoi2014]数表 [莫比乌斯反演 树状数组]

    3529: [Sdoi2014]数表 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1399  Solved: 694[Submit][Status] ...

随机推荐

  1. ASP.NET 文件操作类

    1.读取文件 2.写入文件 using System; using System.Collections.Generic; using System.IO; using System.Linq; us ...

  2. java算法----排序----(2)选择排序

    package log; public class Test4 { /** * java算法---选择排序 * * @param args */ public static void main(Str ...

  3. python 取值方法:截取字符串

    截取最后三位:aa=“TFR20171230001-1”cc=aa[-3]+aa[-2]+aa[-1] aa="1.36x36.8-ddr" bb=aa.split('x')[1] ...

  4. 关于 CSLA 服务器部署WCF访问出错的问题

    MDAA项目 在以前的项目中,只要部署,从来没有发生过 通过WCF访问出错的问题,但是此次却出现如下问题: 2018-04-21 13:45:39,744 [119] ERROR Galaxy.OTC ...

  5. flask seesion组件

    一.简介     flask中session组件可分为内置的session组件还有第三方flask-session组件,内置的session组件功能单一,而第三方的flask-sessoin可支持re ...

  6. Linux/CentOS下安装MySql RPM Bundle

    一.下载对应的版本的MySql安装文件 1.下载路径 https://dev.mysql.com/downloads/mysql/ 2.选择对应的Linux版本和x86/x64位的安装文件 查看Lin ...

  7. MongoDB的导入导出

    一:MongoDB的导出功能 mongodb提供了导入和导出的功能,分别是MongoDB下载目录下的mongoexport.exe和mongoimport.exe文件 ,具体的导出命令格式如下: mo ...

  8. MemAdmin 轻量级可视化Memcached管理工具

    蛮好用的 具体功能看图 开源地址:https://github.com/junstor/memadmin

  9. (11)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- Thrift高效通讯 (完结)

    一. 什么是 RPC Restful 采用 Http 进行通讯,优点是开放.标准.简单.兼容性升级容易: 缺点是性能略低.在 QPS 高或者对响应时间要求苛刻的服务上,可以用 RPC(Remote P ...

  10. Jq_DOM元素方法跟JQuery 核心函数跟JQuery 事件方法

    JQuery DOM 元素 函数                            描述 .get()                           从队列中删除所有未运行的项目. .ind ...