hdu 1542线段树(成段更新+离散化)

本文介绍了一种计算多个矩形覆盖总面积的算法。通过离散化x坐标,并按高度排序矩形边界,利用线段树数据结构进行区间更新,通过节点的累积和确定有效边,最终计算出覆盖面积。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一次做线段成段更新的题,这题需要离散化。

题意:给出几个矩形,求其覆盖面积。

思路:先离散化x坐标,然后加入矩形的上下边,对矩形上下边根据高度进行排序后。建树,从最高的边开始更新线段树,然后就是通过给每条边赋值上边-1下边1,通过节点中

iosum来判断每次线段树中的有效边,每次ans+=有效边*下一层边的高度,最后得出答案。

代码:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#define lson l,m,rt<<1
#define rson m,r,rt<<1|1
using namespace std;
double posx[2001];//对x轴进行离散化
int mx,me;
struct edge
{
    double x1,x2,y;
    int io;//矩形下边的度为1,矩形上边的度为-1(暂且叫作度)
} ee[2001]; //对变进行高度排序
struct node
{
    int iosum;//边的度和
    double  with;//有效高度
} num[8888];
int cmp1(const void *a,const void *b)
{
    return *(double *)a>*(double *)b?1:-1;
}
int cmp2(const void *a,const void *b)
{
    return (*(edge *)a).y>(*(edge *)b).y?1:-1;
}
int bin(double x)
{
    int low=0,high=mx-1,mid;
    while(low<=high)
    {
        mid=(low+high)>>1;
        if(posx[mid]==x) return mid;
        else if(posx[mid]>x) high=mid-1;
        else low=mid+1;
    }
    return -1;
}
void updata(int a,int b,int io,int l,int r,int rt)
{
    if(a<=l&&r<=b)
    {
        num[rt].iosum+=io;
        if(num[rt].iosum)num[rt].with=posx[r]-posx[l];      //////
        else if(l+1==r)num[rt].with=0;                      //////
        else num[rt].with=num[rt<<1].with+num[rt<<1|1].with;//////
        return;
    }
    int m=(l+r)>>1;
    if(a<m)updata(a,b,io,lson);
    if(b>m)updata(a,b,io,rson);
    if(num[rt].iosum)num[rt].with=posx[r]-posx[l];      //////
    else if(l+1==r)num[rt].with=0;                      //////
    else num[rt].with=num[rt<<1].with+num[rt<<1|1].with;//////
}
int main()
{
    int n,i,ca=1,a,b;
    double x1,x2,y1,y2,res;
    while(1)
    {
        scanf("%d",&n);
        if(n==0)break;
        me=mx=0;
        for(i=0; i<n; i++)
        {
            scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
            posx[mx++]=x1;
            posx[mx++]=x2;
            ee[me].x1=x1;
            ee[me].x2=x2;
            ee[me].y=y1;
            ee[me++].io=1;
            ee[me].x1=x1;
            ee[me].x2=x2;
            ee[me].y=y2;
            ee[me++].io=-1;
        }
        qsort(posx,mx,sizeof(posx[0]),cmp1);
        for(i=1,mx=1; i<2*n; i++)
            if(posx[i]!=posx[i-1])posx[mx++]=posx[i];
        qsort(ee,me,sizeof(ee[0]),cmp2);
        memset(num,0,sizeof(node)*8888);
        res=0;
        for(i=0; i<me-1; i++)
        {
            a=bin(ee[i].x1);
            b=bin(ee[i].x2);
            updata(a,b,ee[i].io,0,mx-1,1);
            res+=num[1].with*(ee[i+1].y-ee[i].y);
        }
        printf("Test case #%d\n",ca++);
        printf("Total explored area: %.2lf\n\n",res);
    }
    return 0;
}


转载于:https://www.cnblogs.com/amourjun/archive/2013/06/06/5134138.html

内容概要:本文详细探讨了基于MATLAB/SIMULINK的多载波无线通信系统仿真及性能分析,重点研究了以OFDM为代表的多载波技术。文章首先介绍了OFDM的基本原理和系统组成,随后通过仿真平台分析了不同调制方式的抗干扰性能、信道估计算法对系统性能的影响以及同步技术的实现与分析。文中提供了详细的MATLAB代码实现,涵盖OFDM系统的基本仿真、信道估计算法比较、同步算法实现和不同调制方式的性能比较。此外,还讨论了信道特征、OFDM关键技术、信道估计、同步技术和系统级仿真架构,并提出了未来的改进方向,如深度学习增强、混合波形设计和硬件加速方案。; 适合人群:具备无线通信基础知识,尤其是对OFDM技术有一定了解的研究人员和技术人员;从事无线通信系统设计与开发的工程师;高校通信工程专业的高年级本科生和研究生。; 使用场景及目标:①理解OFDM系统的工作原理及其在多径信道环境下的性能表现;②掌握MATLAB/SIMULINK在无线通信系统仿真中的应用;③评估不同调制方式、信道估计算法和同步算法的优劣;④为实际OFDM系统的设计和优化提供理论依据和技术支持。; 其他说明:本文不仅提供了详细的理论分析,还附带了大量的MATLAB代码示例,便于读者动手实践。建议读者在学习过程中结合代码进行调试和实验,以加深对OFDM技术的理解。此外,文中还涉及了一些最新的研究方向和技术趋势,如AI增强和毫米波通信,为读者提供了更广阔的视野。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值