zoj 3664

4 篇文章 0 订阅
2 篇文章 0 订阅
//暴力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
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值