[codevs3044][POJ1151]矩形面积求并
[codevs3044][POJ1151]矩形面积求并
试题描述
输入
可能有多组数据,读到n=0为止(不超过15组)
每组数据第一行一个数n,表示矩形个数(n<=100)
接下来n行每行4个实数x1,y1,x2,y1(0 <= x1 < x2 <= 100000;0 <= y1 < y2 <= 100000),表示矩形的左下角坐标和右上角坐标
输出
每组数据输出一行表示答案
输入示例
25.5
输出示例
180.00
数据规模及约定
见“输入”
题解
扫描线 + 线段树。
线段树标记永久化,因为这题每个时刻只需要知道线段树根节点的信息,而不是每次查询一段区间,所以很容易实现,具体见代码,或者黄学长的题解。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <algorithm>
#include <cmath>
using namespace std; int read() {
int x = 0, f = 1; char c = getchar();
while(!isdigit(c)){ if(c == '-') f = -1; c = getchar(); }
while(isdigit(c)){ x = x * 10 + c - '0'; c = getchar(); }
return x * f;
} #define maxn 110 struct Line {
int l, r, h, tp;
Line() {}
Line(int _1, int _2, int _3, int _4): l(_1), r(_2), h(_3), tp(_4) {}
bool operator < (const Line& t) const { return h < t.h; }
} ls[maxn<<1];
double posx[maxn<<1], posy[maxn<<1], numx[maxn<<1], numy[maxn<<1], ans; int cntv[maxn<<3];
double sumv[maxn<<3];
void maintain(int L, int R, int o) {
int lc = o << 1, rc = lc | 1;
if(cntv[o]) sumv[o] = numx[R] - numx[L-1];
else if(L == R) sumv[o] = 0;
else sumv[o] = sumv[lc] + sumv[rc];
return ;
}
void update(int L, int R, int o, int ql, int qr, int v) {
if(ql <= L && R <= qr) {
cntv[o] += v;
return maintain(L, R, o);
}
int M = L + R >> 1, lc = o << 1, rc = lc | 1;
if(ql <= M) update(L, M, lc, ql, qr, v);
if(qr > M) update(M+1, R, rc, ql, qr, v);
return maintain(L, R, o);
} int main() {
while(1) {
int n = read(), cntx = 0, cnty = 0, cntl = 0;
if(!n) break;
for(int i = 1; i <= n; i++) {
double x1, x2, y1, y2;
scanf("%lf%lf%lf%lf", &x1, &y1, &x2, &y2);
posx[++cntx] = x1; posx[++cntx] = x2;
posy[++cnty] = y1; posy[++cnty] = y2;
numx[cntx-1] = posx[cntx-1]; numx[cntx] = posx[cntx];
numy[cnty-1] = posy[cnty-1]; numy[cnty] = posy[cnty];
} sort(numx + 1, numx + cntx + 1);
sort(numy + 1, numy + cnty + 1);
for(int i = 1; i <= n; i++) {
int x1, x2, y1, y2;
x1 = lower_bound(numx + 1, numx + cntx + 1, posx[(i<<1)-1]) - numx;
x2 = lower_bound(numx + 1, numx + cntx + 1, posx[i<<1]) - numx;
y1 = lower_bound(numy + 1, numy + cnty + 1, posy[(i<<1)-1]) - numy;
y2 = lower_bound(numy + 1, numy + cnty + 1, posy[i<<1]) - numy;
ls[++cntl] = Line(x1, x2, y1, 1);
ls[++cntl] = Line(x1, x2, y2, -1);
}
sort(ls + 1, ls + cntl + 1); memset(cntv, 0, sizeof(cntv));
memset(sumv, 0, sizeof(sumv));
ans = 0;
double start = numx[1];
for(int i = 1; i < cntx; i++) numx[i] = numx[i+1] - start;
for(int i = 1; i < cntl; i++) {
if(ls[i].l < ls[i].r) update(1, cntx - 1, 1, ls[i].l, ls[i].r - 1, ls[i].tp);
ans += (numy[ls[i+1].h] - numy[ls[i].h]) * sumv[1];
} printf("%.2lf\n", ans);
} return 0;
}
注意:POJ 上输出格式不太一样,详见题面。
[codevs3044][POJ1151]矩形面积求并的更多相关文章
- codves 3044 矩形面积求并
codves 3044 矩形面积求并 题目等级 : 钻石 Diamond 题目描述 Description 输入n个矩形,求他们总共占地面积(也就是求一下面积的并) 输入描述 Input Desc ...
- poj-1151矩形面积并-线段树
title: poj-1151矩形面积并-线段树 date: 2018-10-30 22:35:11 tags: acm 刷题 categoties: ACM-线段树 概述 线段树问题里的另一个问题, ...
- codevs 3044 矩形面积求并
3044 矩形面积求并 题目描述 Description 输入n个矩形,求他们总共占地面积(也就是求一下面积的并) 输入描述 Input Description 可能有多组数据,读到n=0为止(不 ...
- [Codevs] 矩形面积求并
http://codevs.cn/problem/3044/ 线段树扫描线矩形面积求并 基本思路就是将每个矩形的长(平行于x轴的边)投影到线段树上 下边+1,上边-1: 然后根据线段树的权值和与相邻两 ...
- [codevs3044]矩形面积求并
题目描述 Description 输入n个矩形,求他们总共占地面积(也就是求一下面积的并) 输入描述 Input Description 可能有多组数据,读到n=0为止(不超过15组) 每组数据第一行 ...
- 3044 矩形面积求并 - Wikioi
题目描述 Description 输入n个矩形,求他们总共占地面积(也就是求一下面积的并) 输入描述 Input Description 可能有多组数据,读到n=0为止(不超过15组) 每组数据第一行 ...
- POJ 1151 Atlantis 矩形面积求交/线段树扫描线
Atlantis 题目连接 http://poj.org/problem?id=1151 Description here are several ancient Greek texts that c ...
- 矩形面积求并(codevs 3044)
题目描述 Description 输入n个矩形,求他们总共占地面积(也就是求一下面积的并) 输入描述 Input Description 可能有多组数据,读到n=0为止(不超过15组) 每组数据第一行 ...
- poj1151==codevs 3044 矩形面积求并
Atlantis Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 21511 Accepted: 8110 Descrip ...
随机推荐
- magento 自建插件通道服务
首先建立如下的目录结构 在channel.xml中如此写上 <channel> <name>local</name> <uri>http://local ...
- 关于minSdkVersion="8" 升级appcompat_v7包主题"Theme.AppCompat.Light"等不存在的问题
关于minSdkVersion="8" 升级后,又不想用 appcompat_v7包, 那么appcompat_v7主题"Theme.AppCompat.Light&qu ...
- Object流
- React Native for Android 学习
前言 Facebook 在2015.9.15发布了 React Native for Android,把 JavaScript 开发技术扩展到了移动Android平台.基于React的React Na ...
- AJPFX关于static总结
static 总结 static Fields static Methods static member class static initializer-- ...
- Python 设计模式--简单工厂模式
简单工厂模式(Factory Pattern)是一种创建型的设计模式,像工厂一样根据要求生产对象实例. 特点:根据不同的条件,工厂实例化出合适的对象. <大话设计模式>中实例:四则运算计算 ...
- SQL快速备份
ALTER PROCEDURE [dbo].[usp_Backup_DataBase] ( @BackupDataBaseName VARCHAR(128) )AS BE ...
- 网盘资源搜索的一些知识 C#
针对互联网盘上的资源进行搜索查找.写一个网盘资源搜索的要点主要有以下几点. 1.这个网盘资源搜索的原理就是利用互联网搜索引擎的site 命令. 其次就是针对网页链接进行提取以及处理. 首先就是编写一个 ...
- Android基础夯实--重温动画(三)之初识Property Animation
每个人都有一定的理想,这种理想决定着他的努力和判断的方向.就在这个意义上,我从来不把安逸和快乐看作生活目的的本身--这种伦理基础,我叫它猪栏的理想.--爱因斯坦 一.摘要 Property Anima ...
- UI动画效果
UI界面的动画效果总结 方式1:头尾式 //开始动画 [UIView beginAnimations:nil context:nil]; //设置动画时间 [UIView setAnimationDu ...