题目描述

你的老板命令你将停车场里的车移动成他想要的样子。
停车场是一个长条矩形,宽度为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. Luogu P3366 【模板】最小生成树

    qwq #include<cstdio> #include<algorithm> using namespace std; ]; int n,m; struct abc { i ...

  2. curl NSS error -8179 (SEC_ERROR_UNKNOWN_ISSUER)

    尝试分析 首先根据提示,我判断是CA证书过期.于是对证书进行了更新 update-ca-trust 但是依然没有解决问题.之后,尝试了很多方法后,重新回来想想,为什么不适用curl -v来获取更多信息 ...

  3. 用kubernetes部署oa 强制删除pod delete

    1.[root@pserver88 oa]# cat Dockerfile FROM tomcat RUN rm -rf /usr/local/tomcat/webapps/*ADD ROOT.war ...

  4. postgrepsql 创建函数

    -- 这里的CREATE OR REPLACE FUNCTION 为固定写法:   "public"."function_info_a1" 这个为函数名   C ...

  5. ASP.NET Core 2.1 源码学习之 Options[2]:IOptions

    在 上一章 中,介绍了Options的注册,而在使用时只需要注入 IOption<T> 即可: public ValuesController(IOptions<MyOptions& ...

  6. 学习ML.NET(2): 使用模型进行预测

    训练模型 在上一篇文章中,我们已经通过LearningPipeline训练好了一个“鸢尾花瓣预测”模型, var model = pipeline.Train<IrisData, IrisPre ...

  7. Nginx基于TCP/UDP端口的四层负载均衡(stream模块)配置梳理

    通过我们会用Nginx的upstream做基于http/https端口的7层负载均衡,由于Nginx老版本不支持tcp协议,所以基于tcp/udp端口的四层负载均衡一般用LVS或Haproxy来做.至 ...

  8. python报错问题解决:'ascii' codec can't encode character

    之前部署了openstack虚拟化环境,有一天在使用nova list查看虚拟机的时候,突然报错!如下: [root@linux-node1 src]# nova listERROR (Unicode ...

  9. python基础学习笔记(十)

    魔法方法.属性 ------------------------ 准备工作 为了确保类是新型类,应该把 _metaclass_=type 入到你的模块的最开始. class NewType(Objec ...

  10. 个人博客week2

    1. 是否需要有代码规范 对于是否需要有代码规范,请考虑下列论点并反驳/支持: 这些规范都是官僚制度下产生的浪费大家的编程时间.影响人们开发效率, 浪费时间的东西. 我是个艺术家,手艺人,我有自己的规 ...