hdu 4429 Split the Rectangle(lca+二叉树)

本文介绍了一个基于矩形分割的游戏算法,玩家需要通过绘制线段来分割初始矩形,并解决如何通过删除部分线段使得两个指定点位于同一空白矩形内的同时,最大化剩余空白矩形数量的问题。

Split the Rectangle

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 699    Accepted Submission(s): 247


Problem Description
Alice comes up with a new game and wants to play with Bob.
There is one rectangle on the paper initially, we define its lower-left corner's coordinate is (xL, yL) and upper-right corner's coordinate is (xR, yR).
Bob has executed the step as description below N times:
Bob should select one empty rectangle. If the rectangle is the initial one or is split by one vertical segment, he should split it into two parts by drawing one horizontal segment; otherwise he should split the rectangle into two parts by drawing one vertical segment. An empty rectangle means there is no segment in this rectangle except its only four boundary segments.
You should pay attention that there are only two kinds segments: vertical segment and horizontal segment.
Now Bob has several queries. In each query, Bob selects two target points in the paper. (You can assume that all given target points are always located inside the initial rectangle and not in any drawing segments.) He wants Alice to answer the question as soon as possible: Alice can erase several existing segments, and make two target points in one empty rectangle, and she should answer how many empty rectangles at most would be left at last.
But there are some restrictions: Alice cannot erase segments of the initial rectangle (the (xL, yL) to (xR, yR) one), she can only erase segments drew by Bob; if Alice want to erase one segment, both sides of the segment must be empty rectangles, and after erase it, the two empty rectangles must combine to one bigger empty rectangle; if erasing an existing segment will lead to a disconnected graph, the operation is forbidden.

 

Input
There are multiple test cases.
The first line contains four integers xL, yL, xR, yR indicating the coordinates of the lower-left corner and the upper-right corner of the initial huge rectangle respectively. (-100,000 <= xL, yL, xR, yR <= 100,000, xL< xR, yL< yR)
The next line contains two integers N and Q. (1 <= N, Q <= 1000)
The next N lines each line contains four integers x1, y1, x2, y2 indicating the coordinates of two endpoints of one drawing segments. (-100,000 <= x1, y1, x2, y2 <= 100,000, x1=x2 | y1=y2)
The next Q lines each line contains four integers xA, yA, xB, yB indicating the coordinates of two target points in this query. (-100,000 <= xA, yA, xB, yB <= 100,000).

 

Output
For each test case, output Q lines, output the answer of each query in each line.
 

Sample Input
-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 4 4 3 2 0 2 4 2 2 0 2 2 2 2 2 4 1 1 1 3 1 1 3 1 -10 -10 10 10 3 4 -10 0 10 0 0 -10 0 0 0 0 0 10 -9 -9 -8 -8 -9 -9 -9 9 -9 -9 9 -9 -9 -9 9 9
 

Sample Output
4 1 3 4 1 3 1

题意:

给定一个矩形,并给出n条线段,每个线段会将空白的矩形划分成两块。现给出两个点,问通过删除线段的方法能让两个点在同一块空白矩形的时候最多能剩多少个空白矩形?

思路:

每次线段划分矩形的时候都会划分成左右两块矩形。于是可以将这个二维的图建成一棵树。保存线段划分成左右子图的状态。在询问时,寻找他们的最近公共祖先。然后答案就是num[0]-num[pos]+1。


#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn=2005;
int num[maxn];//表示子图的数量
struct rec
{
    int lx,ly,rx,ry;
    int fath,lson,rson,dep;
}q[maxn];
int find(int x,int y)
{
    int r=0,t;
    while(1)
    {
        if(q[r].lson==0) return r;
        t=q[r].lson;
        if(x>=q[t].lx&&x<=q[t].rx&&y>=q[t].ly&&y<=q[t].ry)
            r=t;
        else
            r=q[r].rson;
    }
}
int get_num(int u)
{
    num[u]=0;
    if(q[u].lson==0) return num[u]=1;
    else
    {
        num[u]+=get_num(q[u].lson);
        num[u]+=get_num(q[u].rson);
    }
    return num[u];
}
int lca(int lx,int ly,int rx,int ry)
{
    int a=find(lx,ly);
    int b=find(rx,ry);
    while(a!=b)
    {
        if(q[a].dep<q[b].dep)
            b=q[b].fath;
        else if(q[a].dep>q[b].dep)
            a=q[a].fath;
        else
        {
            a=q[a].fath;
            b=q[b].fath;
        }
    }
    return a;
}
int main()
{
    int lx,ly,rx,ry,n,w,now;
    while(~scanf("%d%d%d%d",&lx,&ly,&rx,&ry))
    {
        now=0;
        q[now++]=(rec){lx,ly,rx,ry,-1,0,0,0};
        scanf("%d%d",&n,&w);
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d%d%d",&lx,&ly,&rx,&ry);
            if(lx>rx) swap(lx,rx);
            if(ly>ry) swap(ly,ry);
            int mx=(lx+rx)/2,my=(ly+ry)/2;
            int pos=find(mx,my);
            int dep=q[pos].dep;
            q[pos].lson=now;
            q[now]=(rec){q[pos].lx,q[pos].ly,rx,ry,pos,0,0,dep+1};
            now++;
            q[pos].rson=now;
            q[now]=(rec){lx,ly,q[pos].rx,q[pos].ry,pos,0,0,dep+1};
            now++;
        }
        get_num(0);
        for(int i=1;i<=w;i++)
        {
            scanf("%d%d%d%d",&lx,&ly,&rx,&ry);
            int pos=lca(lx,ly,rx,ry);
            printf("%d\n",num[0]-num[pos]+1);
        }
    }
    return 0;
}



【轴承故障诊断】加权多尺度字典学习模型(WMSDL)及其在轴承故障诊断上的应用(Matlab代码实现)内容概要:本文介绍了加权多尺度字典学习模型(WMSDL)在轴承故障诊断中的应用,并提供了基于Matlab的代码实现。该模型结合多尺度分析与字典学习技术,能够有效提取轴承振动信号中的故障特征,提升故障识别精度。文档重点阐述了WMSDL模型的理论基础、算法流程及其在实际故障诊断中的实施步骤,展示了其相较于传统方法在特征表达能力和诊断准确性方面的优势。同时,文中还提及该资源属于一个涵盖多个科研方向的技术合集,包括智能优化算法、机器学习、信号处理、电力系统等多个领域的Matlab仿真案例。; 适合人群:具备一定信号处理和机器学习基础,从事机械故障诊断、工业自动化、智能制造等相关领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①学习并掌握加权多尺度字典学习模型的基本原理与实现方法;②将其应用于旋转机械的轴承故障特征提取与智能诊断;③结合实际工程数据复现算法,提升故障诊断系统的准确性和鲁棒性。; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,重点关注字典学习的训练过程与多尺度分解的实现细节,同时可参考文中提到的其他相关技术(如VMD、CNN、BILSTM等)进行对比实验与算法优化。
【硕士论文复现】可再生能源发电与电动汽车的协同调度策略研究(Matlab代码实现)内容概要:本文档围绕“可再生能源发电与电动汽车的协同调度策略研究”展开,旨在通过Matlab代码复现硕士论文中的核心模型与算法,探讨可再生能源(如风电、光伏)与大规模电动汽车接入电网后的协同优化调度方法。研究重点包括考虑需求侧响应的多时间尺度调度、电动汽车集群有序充电优化、源荷不确定性建模及鲁棒优化方法的应用。文中提供了完整的Matlab实现代码与仿真模型,涵盖从场景生成、数学建模到求解算法(如NSGA-III、粒子群优化、ADMM等)的全过程,帮助读者深入理解微电网与智能电网中的能量管理机制。; 适合人群:具备一定电力系统基础知识和Matlab编程能力的研究生、科研人员及从事新能源、智能电网、电动汽车等领域技术研发的工程人员。; 使用场景及目标:①用于复现和验证硕士论文中的协同调度模型;②支撑科研工作中关于可再生能源消纳、电动汽车V2G调度、需求响应机制等课题的算法开发与仿真验证;③作为教学案例辅助讲授能源互联网中的优化调度理论与实践。; 阅读建议:建议结合文档提供的网盘资源下载完整代码,按照目录顺序逐步学习各模块实现,重点关注模型构建逻辑与优化算法的Matlab实现细节,并通过修改参数进行仿真实验以加深理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值