Atlantis(线段树)

本文详细解析了HDU 1542问题的解决方案,通过构建线段树和二分查找优化算法性能,解决多个地图区域的总面积计算问题。使用离散化技巧简化坐标处理,并通过动态更新和区间求和优化算法效率。

http://acm.hdu.edu.cn/showproblem.php?pid=1542

参考了某某大牛的代码。确实代码飘逸,给上注释,怕自己忘了;

Atlantis

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 10210    Accepted Submission(s): 4352


Problem Description
There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. Some of these texts even include maps of parts of the island. But unfortunately, these maps describe different regions of Atlantis. Your friend Bill has to know the total area for which maps exist. You (unwisely) volunteered to write a program that calculates this quantity.
 


 

Input
The input file consists of several test cases. Each test case starts with a line containing a single integer n (1<=n<=100) of available maps. The n following lines describe one map each. Each of these lines contains four numbers x1;y1;x2;y2 (0<=x1<x2<=100000;0<=y1<y2<=100000), not necessarily integers. The values (x1; y1) and (x2;y2) are the coordinates of the top-left resp. bottom-right corner of the mapped area.

The input file is terminated by a line containing a single 0. Don’t process it.
 


 

Output
For each test case, your program should output one section. The first line of each section must be “Test case #k”, where k is the number of the test case (starting with 1). The second one must be “Total explored area: a”, where a is the total explored area (i.e. the area of the union of all rectangles in this test case), printed exact to two digits to the right of the decimal point.

Output a blank line after each test case.
 


 

Sample Input
  
2 10 10 20 20 15 15 25 25.5 0
 


 

Sample Output
  
Test case #1 Total explored area: 180.00
 


 

Source
 
/**从下到上枚举每一条边,对x建树,维护总的边在x轴的贡献**/
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <stack>
#include <string>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
using namespace std;
const int SIZE=2e2+10;
const int maxn=500000;
const int Mod=1e8;
struct Line{
    double h,l,r;
    int f;
    bool operator<(const Line &other)const{
        return h<other.h;
    }
}l[110];
double sum[SIZE<<2];
int cnt[SIZE<<2];
double X[220];
void pushup(int l,int r,int rt){//cnt等于0时sum表示子树(不包括根节点)的覆盖的长度,else表示整棵树被覆盖了
    if(cnt[rt])sum[rt]=X[r+1]-X[l];
    else if(l==r)sum[rt]=0;
    else sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void build(int l,int r,int rt){
    memset(cnt,0,sizeof(cnt));
    memset(sum,0,sizeof(sum));
}
int Bin(double key,int n,double X[]){
    int l=0,r=n-1;
    while(l<=r){
        int m=(l+r)>>1;
        if(X[m]==key)return m;
        if(X[m]<key)l=m+1;
        else r=m-1;
    }
    return -1;
}
void update(int L,int R,int c,int l,int r,int rt){
    if(L<=l&&r<=R){
        cnt[rt]+=c;
        pushup(l,r,rt);
        return;
    }
    int m=(l+r)>>1;
    if(L<=m)update(L,R,c,lson);
    if(R>m)update(L,R,c,rson);
    pushup(l,r,rt);
}
int main()
{
    int n;
    double x1,x2,y1,y2;
    int cas=1;
    while(scanf("%d",&n)&&n){
        for(int i=0;i<n;i++){
            scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
            l[i*2]=(Line){y1,x1,x2,1};//1是下边
            l[i*2+1]=(Line){y2,x1,x2,-1};//-1是下边
            X[2*i]=x1;
            X[2*i+1]=x2;
        }
        sort(X,X+2*n);
        sort(l,l+2*n);
        int m=1;
        for(int i=1;i<2*n;i++){
            if(X[i]!=X[i-1])X[m++]=X[i];//去除重复的X,得到需要离散化的最长的边
        }
        build(0,m-1,1);
        double ans=0;
        for(int i=0;i<2*n-1;i++){//最大的那一条边无需添加
            int L=Bin(l[i].l,m,X);
            int R=Bin(l[i].r,m,X)-1;//bin返回的是线段树边界,lr是线段树的线段
            //printf("%d %d\n",L,R);
            if(L<=R)update(L,R,l[i].f,0,m-1,1);
            ans+=sum[1]*(l[i+1].h-l[i].h);
        }
        printf("Test case #%d\nTotal explored area: %.2lf\n\n",cas++,ans);
    }
    return 0;
}
卡了好久
智慧政务:开启智慧城市新篇章 在当今数字化时代,智慧政务作为智慧城市建设的核心组成部分,正逐步成为提升政府治理能力和公共服务水平的关键力量。 面对传统政务模式中的信息孤岛、管理困难、安全威胁等诸多问题,智慧政务以其独特的优势和解决方案,为政府现代化转型开辟了新路径。 一、传统政务的困境 传统政务模式下,各部门间信息不互通,形成严重的信息孤岛现象,导致管理效率低下。 政府网站缺乏有效管理,信息更新缓慢,无法及时响应民众需求。 同时,安全威胁如黑客攻击和非法入侵频发,严重威胁政务信息安全。 此外,公务人员每日忙于单一、重复的审批任务,企业办事仍需奔波于多个部门之间,个人办证流程复杂且效率低下,这些问题迫切需要得到解决。 二、智慧政务的发展方向与优势 智慧政务通过资源开放、内部协调、决策精准化等手段,推动政府向更加透明、互动、高效的方向发展。 其发展阶段涵盖了从基本在线服务到流程和组织转型的全方位变革。 智慧政务应用深度广泛,包括统一的业务处理云平台、数据交换平台等,实现了政务流程的全面优化。 智慧政务的优势显著:首先,它大幅提高了行政效能,通过优化审批流程,缩短了审批周期,提升了服务质量。 其次,智慧政务促进了信息公开,增强了工作透明度,完善了监督考核机制。 此外,智慧政务还积极响应节能减排号召,实现无纸化办公,减少纸张及打印耗材的使用,降低了出行能耗。 三、智慧政务解决方案:云平台的崛起 云计算作为智慧政务的基础设施,以其资源共享、创新模式、降低成本、随需服务等特性,为智慧政务建设提供了强有力的技术支撑。 通过云平台,政府各部门能够更好地共享信息化基础资源,解决传统政务中基础设施使用率低、资源需求分散等问题。 同时,云计算带来的建设和服务模式创新,使政府信息化工作重点从资产管理转向服务管理,提高了政府运行效率。 四、智慧政务的应用模式与愿景 智慧政务的应用模式实现了从物理实体存在到网络虚拟方式的转变,政府组织结构也从金字塔型向网络型扁平化结构过渡。 这种转变使得政府能够跨越地理限制,实现7×24小时不间断服务。 智慧政务的愿景是构建全程电子化办公环境,待办事件及时推送,政务新闻通过APP及时发布,实现各种审批流程的一站式办理,企业所需政务信息及时推送。 总之,智慧政务作为智慧城市建设的钥匙,正以其独特的优势和解决方案,引领政府向更加高效、透明、互动的方向发展。 随着技术的不断进步和应用模式的不断创新,智慧政务的未来将更加光明,为构建智慧城市、提升民众生活质量作出更大贡献。
内容概要:本文围绕复杂威胁环境下的多无人机协同路径规划问题,提出了一种基于多段杜宾斯(Dubins)路径的协同策略,并提供了完整的Matlab代码实现。该研究重点解决在存在障碍物、禁飞区或其他威胁的环境中,多架无人机如何协同规划出满足动力学约束、避障要求且总体复杂威胁环境下的多无人机协同路径规划研究——基于多段杜宾斯(Dubins)路径的协同策略(Matlab代码实现)性能最优的安全路径。方法结合了Dubins曲线对无人机最小转弯半径等运动学限制的有效建模能力,通过多段路径拼接提升路径灵活性和适应性,并设计协同机制以避免无人机间的冲突,实现高效的任务执行。; 适合人群:具备一定编程基础,熟悉Matlab语言,对无人机路径规划、智能优化算法或自动化控制领域感兴趣的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于科研学习,理解多无人机协同路径规划的核心挑战与解决方案;②作为仿真平台,复现并验证基于Dubins路径的规划算法;③为实际无人机编队飞行、侦察、救援等应用场景提供算法设计与实现参考。; 阅读建议:建议读者结合文中提供的Matlab代码,逐步理解算法的实现逻辑,重点关注威胁环境建模、Dubins路径生成、多机协同避碰等关键环节,并可通过修改参数或场景进行扩展实验,深化对路径规划策略的理解与应用能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值