[codevs3044][POJ1151]矩形面积求并

试题描述

输入n个矩形,求他们总共占地面积(也就是求一下面积的并)

输入

可能有多组数据,读到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]矩形面积求并的更多相关文章

  1. codves 3044 矩形面积求并

    codves  3044 矩形面积求并  题目等级 : 钻石 Diamond 题目描述 Description 输入n个矩形,求他们总共占地面积(也就是求一下面积的并) 输入描述 Input Desc ...

  2. poj-1151矩形面积并-线段树

    title: poj-1151矩形面积并-线段树 date: 2018-10-30 22:35:11 tags: acm 刷题 categoties: ACM-线段树 概述 线段树问题里的另一个问题, ...

  3. codevs 3044 矩形面积求并

    3044 矩形面积求并   题目描述 Description 输入n个矩形,求他们总共占地面积(也就是求一下面积的并) 输入描述 Input Description 可能有多组数据,读到n=0为止(不 ...

  4. [Codevs] 矩形面积求并

    http://codevs.cn/problem/3044/ 线段树扫描线矩形面积求并 基本思路就是将每个矩形的长(平行于x轴的边)投影到线段树上 下边+1,上边-1: 然后根据线段树的权值和与相邻两 ...

  5. [codevs3044]矩形面积求并

    题目描述 Description 输入n个矩形,求他们总共占地面积(也就是求一下面积的并) 输入描述 Input Description 可能有多组数据,读到n=0为止(不超过15组) 每组数据第一行 ...

  6. 3044 矩形面积求并 - Wikioi

    题目描述 Description 输入n个矩形,求他们总共占地面积(也就是求一下面积的并) 输入描述 Input Description 可能有多组数据,读到n=0为止(不超过15组) 每组数据第一行 ...

  7. POJ 1151 Atlantis 矩形面积求交/线段树扫描线

    Atlantis 题目连接 http://poj.org/problem?id=1151 Description here are several ancient Greek texts that c ...

  8. 矩形面积求并(codevs 3044)

    题目描述 Description 输入n个矩形,求他们总共占地面积(也就是求一下面积的并) 输入描述 Input Description 可能有多组数据,读到n=0为止(不超过15组) 每组数据第一行 ...

  9. poj1151==codevs 3044 矩形面积求并

    Atlantis Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 21511   Accepted: 8110 Descrip ...

随机推荐

  1. 贪心 Codeforces Round #173 (Div. 2) B. Painting Eggs

    题目传送门 /* 题意:给出一种方案使得abs (A - G) <= 500,否则输出-1 贪心:每次选取使他们相差最小的,然而并没有-1:) */ #include <cstdio> ...

  2. iOS9 关于明文HTTP报错的修复方法

    报错:App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. ...

  3. Java编码格式

    简介 编码问题一直困扰着开发人员,尤其在 Java 中更加明显,因为 Java 是跨平台语言,不同平台之间编码之间的切换较多.本文将向你详细介绍 Java 中编码问题出现的根本原因,你将了解到:Jav ...

  4. rhel7安装oracle 11gR2

    一.修改操作系统核心参数 在Root用户下执行以下步骤: 1)修改用户的SHELL的限制,修改/etc/security/limits.conf文件 输入命令:vi /etc/security/lim ...

  5. 微信“摇一摇&#183;周边”正式开放

    今日,在微信公开课第三季长沙站现场,微信团队宣布“摇一摇·周边”(以下简称“摇周边”)正式对外开放.拥有微信认证的公众帐号商户,均可通过摇周边的商户申请平台(https://zb.weixin.qq. ...

  6. GCC的函数声明问题

    Thinking in C++ 第四章 GCC 不需要再MAIN函数前声明 编译也能通过. G++不行.

  7. vue 2.0 路由创建的详解过程

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. H.264学习笔记6——指数哥伦布编码

    一.哥伦布码 哥伦布码就是将编码对象分能成等间隔的若干区间(Group),每个Group有一个索引值:Group Id. >对于Group Id采用二元码编码: >对于Group内的编码对 ...

  9. H.264学习笔记1——相关概念

    此处记录学习AVC过程中的一些基本概念,不定时更新. frame:帧,相当于一幅图像,包含一个亮度矩阵和两个色度矩阵. field:场,一帧图像,通过隔行扫描得到奇偶两场,分别称为顶场和底场或奇场和偶 ...

  10. Visual Studio 2013 错误系统找不到指定文件,0x80070002

    错误:Visual Studio 2013 按照成功后,可以创建空web项目,但不能建webform 和 mvc 项目. 提示系统找不到指定文件,0x80070002. 解决方式: Step1: Wi ...