[日常摸鱼]poj1151Atlantis-扫描线

二维几何图形并集面积计算
本文介绍一种基于线段树的数据结构算法,用于解决多个长宽平行于坐标轴的长方形并集面积的计算问题。通过将y坐标离散化,并在线段树中维护每个节点对应线段的信息,实现高效的更新与查询。文章提供了详细的代码实现,包括线段树的建立、修改和查询过程。

题意:给一堆长宽平行于坐标轴的长方形求并的面积

 


 

 

我个沙茶快写了一晚上…

大概思想就是先根据$y$坐标排个序,把$y$坐标离散化一下,放到线段树里面维护,这里的写法是让线段树的节点储存这个点对应的整段线段的信息,更新的时候如果不行就把线段拆开,以及注意一些细节(比如这里右孩子的区间是[mid,r]而不是[mid+1,r]因为下标其实应该是连续的实数)

我也讲不清楚了具体看代码…

#include<cstdio>
#include<algorithm>
#define rep(i,n) for(register int i=1;i<=n;i++)
#define REP(i,a,b) for(register int i=a;i<=b;i++)
#define debug(x) printf("%s = %d\n",#x,x)
using namespace std;
typedef double dl;
const int N=105;
struct tree
{
    dl l,r,s;int c;
}tr[N<<3];
struct Line
{
    dl x,y1,y2;int f;
    Line(dl x=0,dl y1=0,dl y2=0,int f=0):x(x),y1(y1),y2(y2),f(f){}
}ls[N<<1];
int T,n,cnt,tot;
dl y[N<<1],ans,x1,x2,y1,y2;
inline bool operator <(Line a,Line b)
{
    return a.x<b.x;
}
#define lson (o<<1)
#define rson (o<<1|1)
inline void push_up(int o,int l,int r)
{
    if(tr[o].c>0)
        tr[o].s=tr[o].r-tr[o].l;
    else if(l+1==r)
        tr[o].s=0;
    else
        tr[o].s=tr[lson].s+tr[rson].s;
}
inline void build(int o,int l,int r)
{
    tr[o].l=y[l];tr[o].r=y[r];
    if(l+1==r)return;
    int mid=(l+r)>>1;
    build(lson,l,mid);build(rson,mid,r);
}
inline void modify(int o,int l,int r,Line e)
{
    if(tr[o].l==e.y1&&tr[o].r==e.y2)
    {
        tr[o].c+=e.f;
        push_up(o,l,r);return;
    }int mid=(l+r)>>1;
    if(e.y2<=tr[lson].r)modify(lson,l,mid,e);
    else if(e.y1>=tr[rson].l)modify(rson,mid,r,e);
    else
    {
        modify(lson,l,mid,Line(e.x,e.y1,tr[lson].r,e.f));
        modify(rson,mid,r,Line(e.x,tr[rson].l,e.y2,e.f));
    }
    push_up(o,l,r);
}
int main()
{
    while(scanf("%d",&n)&&n)
    {
        rep(i,n)
        {
            scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
            y[++cnt]=y1;y[++cnt]=y2;
            ls[++tot]=Line(x1,y1,y2,1);ls[++tot]=Line(x2,y1,y2,-1);
        }
        sort(y+1,y+cnt+1);sort(ls+1,ls+tot+1);
        build(1,1,cnt);modify(1,1,cnt,ls[1]);
        REP(i,2,tot)
        {
            ans+=(ls[i].x-ls[i-1].x)*tr[1].s;
            modify(1,1,cnt,ls[i]);
        }
        printf("Test case #%d\n",++T);
        printf("Total explored area: %.2lf\n\n",ans);
        ans=tot=cnt=0;
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/yoooshinow/p/8331083.html

采用PyQt5框架与Python编程语言构建图书信息管理平台 本项目基于Python编程环境,结合PyQt5图形界面开发库,设计实现了一套完整的图书信息管理解决方案。该系统主要面向图书馆、书店等机构的日常运营需求,通过模块化设计实现了图书信息的标准化管理流程。 系统架构采用典型的三层设计模式,包含数据存储层、业务逻辑层和用户界面层。数据持久化方案支持SQLite轻量级数据库与MySQL企业级数据库的双重配置选项,通过统一的数据库操作接口实现数据存取隔离。在数据建模方面,设计了包含图书基本信息、读者档案、借阅记录等核心数据实体,各实体间通过主外键约束建立关联关系。 核心功能模块包含六大子系统: 1. 图书编目管理:支持国际标准书号、中国图书馆分类法等专业元数据的规范化著录,提供批量导入与单条录入两种数据采集方式 2. 库存动态监控:实时追踪在架数量、借出状态、预约队列等流通指标,设置库存预警阈值自动提醒补货 3. 读者服务管理:建立完整的读者信用评价体系,记录借阅历史与违规行为,实施差异化借阅权限管理 4. 流通业务处理:涵盖借书登记、归还处理、续借申请、逾期计算等标准业务流程,支持射频识别技术设备集成 5. 统计报表生成:按日/月/年周期自动生成流通统计、热门图书排行、读者活跃度等多维度分析图表 6. 系统维护配置:提供用户权限分级管理、数据备份恢复、操作日志审计等管理功能 在技术实现层面,界面设计遵循Material Design设计规范,采用QSS样式表实现视觉定制化。通过信号槽机制实现前后端数据双向绑定,运用多线程处理技术保障界面响应流畅度。数据验证机制包含前端格式校验与后端业务规则双重保障,关键操作均设有二次确认流程。 该系统适用于中小型图书管理场景,通过可扩展的插件架构支持功能模块的灵活组合。开发过程中特别注重代码的可维护性,采用面向对象编程范式实现高内聚低耦合的组件设计,为后续功能迭代奠定技术基础。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值