zoj 3664

//暴力lca:這個題,從頭找,最後一個符合條件的點就是最近祖先點
//每次畫一條線,一個矩形變成2個,這不就是二叉樹嘛?
#include <stdio.h>
#include <iostream>
#include <string.h>

using namespace std;
const int N=3000;
struct pot
{
    int x,y;
    pot(int a,int b)
    {
        x=a,y=b;
    }
};
struct re
{
    int x,y,x2,y2;
    void read(int xl,int yl,int xr,int yr)
    {
        x=xl,y=yl,x2=xr,y2=yr;
    }
    bool in(int xl,int yl,int xr,int yr)
    {
        return xl>=x && yl>=y && xr<=x2 && yr<=y2;
    }
};
re c[N];
int xl,yl,xr,yr;
int num;//矩形的編號
int lson[N],rson[N],cnt[N];//cnt表示編號爲i的矩陣內含線的條數
int n,q;
void update_from_root(int u)
{
    cnt[u]++;
    if(lson[u]==-1)
    {
        lson[u]=++num,rson[u]=++num;
        c[lson[u]].read(xl,yl,c[u].x2,c[u].y2);
        c[rson[u]].read(c[u].x,c[u].y,xr,yr);
    }
    else
    {
      if(c[lson[u]].in(xl,yl,xr,yr)) update_from_root(lson[u]);
       else update_from_root(rson[u]);
    }
}
int query(int u)
{
    if(lson[u]==-1) return cnt[u];
    if(c[lson[u]].in(xl,yl,xr,yr)) return query(lson[u]);
    if(c[rson[u]].in(xl,yl,xr,yr)) return query(rson[u]);
    return cnt[u];
}
int main()
{
    while(~scanf("%d%d%d%d",&xl,&yl,&xr,&yr))
    {
        memset(cnt,0,sizeof cnt);
        memset(lson,-1,sizeof lson);
        memset(rson,-1,sizeof rson);
        c[1].read(xl,yl,xr,yr);
        scanf("%d%d",&n,&q);
        int n1=n;
        num=1;
        while(n--)
        {
            scanf("%d%d%d%d",&xl,&yl,&xr,&yr);
            if(xl>xr) {int tmp=xl;xl=xr;xr=tmp;}
            if(yl>yr){int tmp=yl;yl=yr;yr=tmp;}
            update_from_root(1);
        }
        while(q--)
        {
            scanf("%d%d%d%d",&xl,&yl,&xr,&yr);
            if(xl>xr) {int tmp=xl;xl=xr;xr=tmp;}
            if(yl>yr){int tmp=yl;yl=yr;yr=tmp;}
            printf("%d\n",n1+1-query(1));
        }
    }
    return 0;
}
/*
-10 -10 10 10
5 1
-10 0 10 0
5 -10 5 0
-5 0 -5 10
-5 5 10 5
5 -5 10 -5
0 -3 7 -3
*/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章