HDU_1542_线段树【扫描线】
Atlantis
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 11514 Accepted Submission(s): 4891
The input file is terminated by a line containing a single 0. Don’t process it.
Output a blank line after each test case.
struct segment //这就是传说中的扫描线
{
double l,r,h; //l,r是左右端点,h为高度
int f; //上边f为-1,下边为1
}ss[2*MAXN]; //ss存的是所有矩形的上下边的信息

- #include<cstdio>
- #include<set>
- #include<iostream>
- #include<vector>
- #include<algorithm>
- #include<map>
- #include<cmath>
- #include<string>
- #include<cstring>
- using namespace std;
- #define MAXN 105
- #define lson l,mid,rt<<1
- #define rson mid+1,r,rt<<1|1
- struct segment
- {
- double l,r,h;
- int f;
- }ss[*MAXN];
- struct Node
- {
- int l,r;
- int cnt;
- double len;
- int mid()
- {
- return (l+r>>);
- }
- }tt[*MAXN*];
- double pos[*MAXN];
- int nums;
- bool cmp(segment a,segment b)
- {
- return a.h<b.h;
- }
- void build(int l,int r,int rt)
- {
- tt[rt].l=l;
- tt[rt].r=r;
- tt[rt].cnt=;
- tt[rt].len=;
- if(l==r)
- return;
- int mid=(l+r)>>;
- build(lson);
- build(rson);
- }
- int binary(double key,int l,int r)
- {
- while(l<=r)
- {
- int mid=(l+r)>>;
- if(pos[mid]==key)
- return mid;
- else if(key<pos[mid])
- r=mid-;
- else
- l=mid+;
- }
- return -;
- }
- void get_len(int rt)
- {
- if(tt[rt].cnt)
- tt[rt].len=pos[tt[rt].r+]-pos[tt[rt].l];
- else if(tt[rt].l==tt[rt].r)
- tt[rt].len=;
- else
- tt[rt].len=tt[rt<<].len+tt[rt<<|].len;
- }
- void update(int l,int r,int val,int rt)
- {
- if(tt[rt].l==l&&tt[rt].r==r)
- {
- tt[rt].cnt+=val;
- get_len(rt);
- return;
- }
- int mid=tt[rt].mid();
- if(r<=mid)
- update(l,r,val,rt<<);
- else if(l>mid)
- update(l,r,val,rt<<|);
- else
- {
- update(l,mid,val,rt<<);
- update(mid+,r,val,rt<<|);
- }
- get_len(rt);
- }
- int main()
- {
- int cas=;
- int n;
- while(scanf("%d",&n)!=EOF&&n)
- {
- nums=;
- for(int i=;i<n;i++)
- {
- double x1,x2,y1,y2;
- scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
- ss[nums].l=x1;ss[nums].r=x2;ss[nums].h=y1;ss[nums].f=-;
- ss[nums+].l=x1;ss[nums+].r=x2;ss[nums+].h=y2;ss[nums+].f=;
- pos[nums]=x1;pos[nums+]=x2;
- nums+=;
- }
- sort(ss,ss+nums,cmp);
- sort(pos,pos+nums);
- int m=;
- for(int i=;i<nums;i++)
- if(pos[i]!=pos[i-])
- pos[m++]=pos[i];
- build(,m-,);
- double ans=;
- for(int i=;i<nums;i++)
- {
- int l=binary(ss[i].l,,m-);
- int r=binary(ss[i].r,,m-)-;
- update(l,r,ss[i].f,);
- ans+=(ss[i+].h-ss[i].h)*tt[].len;
- }
- printf("Test case #%d\n",++cas);
- printf("Total explored area: %.2f\n\n",ans);
- }
- return ;
- }
HDU_1542_线段树【扫描线】的更多相关文章
- 【Codeforces720D】Slalom 线段树 + 扫描线 (优化DP)
D. Slalom time limit per test:2 seconds memory limit per test:256 megabytes input:standard input out ...
- Codeforces VK CUP 2015 D. Closest Equals(线段树+扫描线)
题目链接:http://codeforces.com/contest/522/problem/D 题目大意: 给你一个长度为n的序列,然后有m次查询,每次查询输入一个区间[li,lj],对于每一个查 ...
- 【POJ-2482】Stars in your window 线段树 + 扫描线
Stars in Your Window Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11706 Accepted: ...
- HDU 4419 Colourful Rectangle --离散化+线段树扫描线
题意: 有三种颜色的矩形n个,不同颜色的矩形重叠会生成不同的颜色,总共有R,G,B,RG,RB,GB,RGB 7种颜色,问7种颜色每种颜色的面积. 解法: 很容易想到线段树扫描线求矩形面积并,但是如何 ...
- BZOJ-3228 棋盘控制 线段树+扫描线+鬼畜毒瘤
3228: [Sdoi2008]棋盘控制 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 23 Solved: 9 [Submit][Status][D ...
- BZOJ-3225 立方体覆盖 线段树+扫描线+乱搞
看数据范围像是个暴力,而且理论复杂度似乎可行,然后被卡了两个点...然后来了个乱搞的线段树+扫描线.. 3225: [Sdoi2008]立方体覆盖 Time Limit: 2 Sec Memory L ...
- hdu 5091(线段树+扫描线)
上海邀请赛的一道题目,看比赛时很多队伍水过去了,当时还想了好久却没有发现这题有什么水题的性质,原来是道成题. 最近学习了下线段树扫描线才发现确实是挺水的一道题. hdu5091 #include &l ...
- POJ1151+线段树+扫描线
/* 线段树+扫描线+离散化 求多个矩形的面积 */ #include<stdio.h> #include<string.h> #include<stdlib.h> ...
- POJ-1151-Atlantis(线段树+扫描线+离散化)[矩形面积并]
题意:求矩形面积并 分析:使用线段树+扫描线...因为坐标是浮点数的,因此还需要离散化! 把矩形分成两条边,上边和下边,对横轴建树,然后从下到上扫描上去,用col表示该区间有多少个下边,sum代表该区 ...
- HDU 5107 线段树扫描线
给出N个点(x,y).每一个点有一个高度h 给出M次询问.问在(x,y)范围内第k小的高度是多少,没有输出-1 (k<=10) 线段树扫描线 首先离散化Y坐标,以Y坐标建立线段树 对全部的点和询 ...
随机推荐
- Java中DAO/DTO/PO/VO/BO/QO/POJO
ORM:是Object Relational Mapping(对象关系映射)的缩写. 通俗点讲,就是将对象与关系数据库绑定,用对象来表示关系数据.在O/R/M的世界里,有两个基本的也是重要的东东需要了 ...
- ZFS
zfs是128bit文件系统,那么为什么容量是2^64byte? 不应该是2^128 / 2^3=2^125 byte吗 文件系统不再局限于单独的物理设备,而且文件系统还允许物理设备把他们自带的那些文 ...
- apache2 ubuntu18.04 配置虚拟端口
修改3个文件/etc/apache2/apache2.conf/etc/apache2/ports.conf/etc/apache2/sites-available/000-default.conf ...
- 从理论到实践,全方位认识DNS(理论篇)
对于 DNS(Domain Name System) 大家肯定不陌生,不就是用来将一个网站的域名转换为对应的IP吗.当我们发现可以上QQ但不能浏览网页时,我们会想到可能是域名服务器挂掉了:当我们用别人 ...
- vmware9.0 install ubuntu
1)安装vmware 9.0 + 注册码2)因为是.bundle文件,执行下列命令:sudo chmod +x VMware-Workstation-7.1.1-282343.i386.bundle ...
- requireJS defined undefined
requeireJS 在使用时,在 defined 注入一个依赖,路径正确,却发现获得的值却是 undefined .这时候就要考虑是否是“循环依赖”的原因了. 循环依赖就是: a.js 依赖了 b. ...
- 利用rman自己主动备份转储spfile
利用rman自己主动备份转储spfile [情景简单介绍] 生产环境丢失了server的參数文件,rman已开启自己主动备份设置. [操作过程简述] ----启动rman $rman target / ...
- 从头认识java-13.7 什么时候使用泛型?
这一章节我们来讨论一下什么时候使用泛型? 答案:当你希望代码能够跨多个类型(不同的类型,不包括继承关系)工作的时候. 1.当没有确切类型的时候 以下是错误的代码: package com.ray.ch ...
- Uva 10036 - Divisibility
Consider an arbitrary sequence of integers. One can place + or - operators between integers in the s ...
- imagebutton 设置了src属性的图片更换
<ImageButton android:id="@+id/mediacontroller_play_pause" android:layout_width="wr ...