zoukankan      html  css  js  c++  java
  • bzoj 3718: [PA2014]Parking

    Description

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

    Input

    第一行为一个整数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行,格式和意义同上,表示车的目标位置。

    Output

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

    Sample Input

    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

    Sample Output

    TAK
    NIE

    HINT

    Source

    鸣谢Jcvb

    r_64考试的原题,只不过r_64把它弱化了一下;

    首先给出一个结论,手完2就会发现,但是r_64略证了一下:
         对。准确地来说这是道结论题。如果两个滑块宽度(y 2 − y 1 )之和大于w,且横坐标相对
    位置前后不一致,那么就无解。
         仔细想想其实挺有道理。首先,如果这样的两个滑块存在,那么在移动过程中它们的相
    对顺序(谁在左谁在右)肯定会发生改变。这样,必定有一个时刻,一条直线x = x 0 同时穿过
    这两个滑块。但是这与它们宽度之和大于w矛盾。

    于是我们只要找到x1[i]>x1[j],x3[i]<x3[j[,len[i]>w-len[j],就是不合法,这个看起来是个三维偏序啊,但是我们只有找到一个就行了;

    所以第三维len[i]只要记max就行了,所以就是二维偏序了,一维排序后树状数组即可;

    //MADE BY QT666
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    typedef long long ll;
    const int N=100050;
    struct data{
        int x1,x2,x3,x4,y1,y2,y3,y4,len;
    }g[N];
    int n,w,tr[N],tot,hsh[N];
    bool cmp(const data &a,const data &b){
        if(a.x1==b.x1) return a.x3>b.x3;
        return a.x1>b.x1;
    }
    int lowbit(int x){return x&-x;}
    void update(int x,int v){
        for(int i=x;i<=tot;i+=lowbit(i)) tr[i]=max(tr[i],v);
    }
    int query(int x){
      int ret=0;
      if(x==0) return 0;
      for(int i=x;i;i-=lowbit(i)) ret=max(ret,tr[i]);
      return ret;
    }
    int main(){
        int T;scanf("%d",&T);int tmp=0;
        while(T--){
        scanf("%d%d",&n,&w);int flg=0;tot=0;tmp++;
        for(int i=1;i<=n;i++){
            scanf("%d%d%d%d",&g[i].x1,&g[i].y1,&g[i].x2,&g[i].y2);
            if(g[i].x1>g[i].x2) swap(g[i].x1,g[i].x2);
            if(g[i].y1>g[i].y2) swap(g[i].y1,g[i].y2);
            hsh[++tot]=g[i].x1;
            g[i].len=g[i].y2-g[i].y1;
        }
        for(int i=1;i<=n;i++){
            scanf("%d%d%d%d",&g[i].x3,&g[i].y3,&g[i].x4,&g[i].y4);
            if(g[i].x3>g[i].x4) swap(g[i].x3,g[i].x4);
            if(g[i].y3>g[i].y4) swap(g[i].y3,g[i].y4);
            hsh[++tot]=g[i].x3;
        }
        if(!flg){
            sort(hsh+1,hsh+1+tot);tot=unique(hsh+1,hsh+1+tot)-hsh-1;
            sort(g+1,g+1+n,cmp);memset(tr,0,sizeof(tr));
            for(int i=1;i<=n;i++){
            int x=lower_bound(hsh+1,hsh+1+tot,g[i].x3)-hsh;
            if(query(x-1)>w-g[i].len){
                flg=1;puts("NIE");break;
            }
            update(x,g[i].len);
            }
            if(!flg) puts("TAK");
        }
        }
        return 0;
    }
    
  • 相关阅读:
    Use jQuery to hide a DIV when the user clicks outside of it
    Backbone
    重学HTML
    javaScript return false
    Regular Expression--Good parts
    ASP.NET批量下载文件的方法
    ASP.NET多文件批量打包下载
    word图文混排复制到UEditor图片不显示
    百度ueditor 拖文件或world 里面复制粘贴图片到编辑中 上传到第三方问题
    Ueditor Word图片转存交互
  • 原文地址:https://www.cnblogs.com/qt666/p/7653392.html
Copyright © 2011-2022 走看看