Atlantis HDU - 1542
Problem Description
Input
The input file is terminated by a line containing a single 0. Don’t process it.
Output
Output a blank line after each test case.
10 10 20 20
15 15 25 25.5
0
Total explored area: 180.00
题解:
好像这个是线段树扫描线矩阵合并模板
#include<cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1 | 1
const int MAXN=300;
const int INF=0x3f3f3f3f;
const int MOD=1e9+7;
int n;
double all[MAXN];
struct Seg{
double l,r,h;
int d;
Seg(){};//这是一个构造函数,应与结构体或类名相同
Seg(double l,double r,double h,int d):l(l),r(r),h(h),d(d){}
bool operator <(const Seg& rhs )const {
return h<rhs.h;
}
}a[MAXN];
int cnt[MAXN<<2];//懒标记
double sum[MAXN<<2]; void pushup(int l,int r,int rt )
{
if(cnt[rt]) sum[rt]=all[r+1]-all[l];
else if(l==r) sum[rt]=0;
else{
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
} void update(int L,int R,int v,int l,int r,int rt)//区间更新
{
if(l>=L&&r<=R)
{
cnt[rt]+=v;
pushup(l,r,rt);
return;
}
int mid=(l+r)>>1;
if(L<=mid)update(L,R,v,l,mid,rt<<1);
if(R>mid) update(L,R,v,mid+1,r,rt<<1|1);
pushup(l,r,rt);
} int main()
{
int Case=0;
while (scanf("%d",&n)!=EOF&&n)
{
double x1,y1,x2,y2;
for (int i = 1; i <=n ; ++i) {
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
a[i]=Seg(x1,x2,y1,1);
a[i+n]=Seg(x1,x2,y2,-1); all[i]=x1;all[i+n]=x2;
}
n<<=1;
sort(a+1,a+1+n);//使线条从下向上排列。 sort(all+1,all+n+1);
int m=unique(all+1,all+1+n)-all-1;//这个函数是"去掉"相邻位置的重复,移到末尾
memset(sum,0,sizeof(sum));
memset(cnt,0, sizeof(cnt));
double ans=0;
for (int i = 1; i <n ; ++i) { int l=lower_bound(all+1,all+1+m,a[i].l)-all;//离散化
int r=lower_bound(all+1,all+1+m,a[i].r)-all; if(l<r) update(l,r-1,a[i].d,1,m,1); ans+=sum[1]*(a[i+1].h-a[i].h);
} printf("Test case #%d\nTotal explored area: %.2lf\n\n",++Case,ans); }
return 0;
}
Atlantis HDU - 1542的更多相关文章
- 线段树 扫描线 L - Atlantis HDU - 1542 M - City Horizon POJ - 3277 N - Paint the Wall HDU - 1543
学习博客推荐——线段树+扫描线(有关扫描线的理解) 我觉得要注意的几点 1 我的模板线段树的叶子节点存的都是 x[L]~x[L+1] 2 如果没有必要这个lazy 标志是可以不下传的 也就省了一个pu ...
- 线段树扫描线(一、Atlantis HDU - 1542(覆盖面积) 二、覆盖的面积 HDU - 1255(重叠两次的面积))
扫描线求周长: hdu1828 Picture(线段树+扫描线+矩形周长) 参考链接:https://blog.csdn.net/konghhhhh/java/article/details/7823 ...
- Atlantis HDU - 1542 (线段树扫描线)
There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. Some ...
- Atlantis HDU - 1542 (扫描线,线段树)
扫描线的模板题,先把信息接收,然后排序,记录下上边和下边,然后用一条虚拟的线从下往上扫.如果我扫到的是下边,那么久用线段树在这个区间内加上1,表示这个区间现在是有的,等我扫描到上边的时候在加上-1,把 ...
- 线段树->面积并 Atlantis HDU - 1542
题目链接:https://cn.vjudge.net/problem/HDU-1542 题目大意:求面积并 具体思路:我们首先把矩形分割成一横条一横条的,然后对于每一个我们给定的矩形,我们将储存两个点 ...
- Atlantis HDU - 1542 线段树+扫描线 求交叉图形面积
//永远只考虑根节点的信息,说明在query时不会调用pushdown //所有操作均是成对出现,且先加后减 // #include <cstdio> #include <cstri ...
- HDU 1542 Atlantis(线段树扫描线+离散化求面积的并)
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- (HDU 1542) Atlantis 矩形面积并——扫描线
n个矩形,可以重叠,求面积并. n<=100: 暴力模拟扫描线.模拟赛大水题.(n^2) 甚至网上一种“分块”:分成n^2块,每一块看是否属于一个矩形. 甚至这个题就可以这么做. n<=1 ...
- HDU 1542 Atlantis(矩形面积并)
HDU 1542 Atlantis 题目链接 题意:给定一些矩形,求面积并 思路:利用扫描线,因为这题矩形个数不多,直接暴力扫就能够了.假设数据大.就要用线段树 代码: #include <cs ...
随机推荐
- select标签使用 三目运算符
<td> <select id="roleName" name="roleName" class="input" styl ...
- HTML文本格式化用法
1.HTML 文本格式化标签 标签 描述 <b> 定义粗体文本 <em> 定义着重文字,显示为斜体 <i> 定义斜体字 <small> 定义小号字 &l ...
- Leetcode 78. Subsets (backtracking) 90 subset
using prev class Solution { List<List<Integer>> res = new ArrayList<List<Integer&g ...
- 获取url中的某个字段的值
function getUrl(name, url) { url = url || window.location.search; var reg = new RegExp("(^|& ...
- 请教Nutzwk项目,在beetl页面怎么用shiro标签呢?
请教Nutzwk项目,在beetl页面怎么用shiro标签呢? 发布于 381天前 作者 WenTao-Love 195 次浏览 复制 上一个帖子 下一个帖子 标签: nutzwk 如题 ...
- POJ-2029 Get Many Persimmon Trees---二维树状数组+枚举
题目链接: https://vjudge.net/problem/POJ-2029 题目大意: 有N棵树在一个n*m的田里,给出每颗树的坐标 用一个s*t的矩形去围,最多能围几棵树 思路: 用二维树状 ...
- vuejs动态组件和v-once指令
场景,点击某个按钮,两个子组件交替显示 <div id='root'> <child-one v-if='type==="child-one"'></ ...
- url网址解析的好帮手
接下来进入node的重点,也就是介绍nodejs主要api的功能和如果使用,由于nodejs逐渐能满足这种高并发和大规模的场景.他才被更多的公司所采用 无论什么资源,一定要有明确的地址才有意义,在互联 ...
- CentOS 6\7修改主机名
1.CentOS6修改主机名 1)临时修改主机名: 显示主机名: oracle@localhost:~$ hostname localhost 修改 oracle@localhost:~$ sudo ...
- javascript入门笔记8-window对象
History 对象 history对象记录了用户曾经浏览过的页面(URL),并可以实现浏览器前进与后退相似导航的功能. 注意:从窗口被打开的那一刻开始记录,每个浏览器窗口.每个标签页乃至每个框架,都 ...