poj 1389(离散化+计算几何)
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 3412 | Accepted: 1763 |
Description
Assume that the contour of their union is defi ned by a set S of
segments. We can use a subset of S to construct simple polygon(s).
Please report the total area of the polygon(s) constructed by the subset
of S. The area should be as large as possible. In a 2-D xy-plane, a
polygon is defined by a finite set of segments such that every segment
extreme (or endpoint) is shared by exactly two edges and no subsets of
edges has the same property. The segments are edges and their extremes
are the vertices of the polygon. A polygon is simple if there is no
pair of nonconsecutive edges sharing a point.
Example: Consider the following three rectangles:
rectangle 1: < (0, 0) (4, 4) >,
rectangle 2: < (1, 1) (5, 2) >,
rectangle 3: < (1, 1) (2, 5) >.
The total area of all simple polygons constructed by these rectangles is 18.
Input
input consists of multiple test cases. A line of 4 -1's separates each
test case. An extra line of 4 -1's marks the end of the input. In each
test case, the rectangles are given one by one in a line. In each line
for a rectangle, 4 non-negative integers are given. The first two are
the x and y coordinates of the lower-left corner. The next two are the x
and y coordinates of the upper-right corner.
Output
Sample Input
0 0 4 4
1 1 5 2
1 1 2 5
-1 -1 -1 -1
0 0 2 2
1 1 3 3
2 2 4 4
-1 -1 -1 -1
-1 -1 -1 -1
Sample Output
18
10 题意:矩形面积交.
只用了离散化没用线段树也 47MS AC。。就是耗费的空间大了点,,不过将vis数组开成bool类型应该可以少很多空间..
///离散化
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <cmath>
using namespace std;
const int N = ;
struct Rec{
int x1,y1,x2,y2;
}rec[N];
int x[N],y[N];
int vis[N][N];
int k,t;
int binary1(int value){
int mid,l=,r=k-;
while(l<r){
mid = (l+r)>>;
if(x[mid]==value) return mid;
if(x[mid]<value) l = mid+;
else r = mid-;
}
return l;
}
int binary2(int value){
int mid,l=,r=k-;
while(l<r){
mid = (l+r)>>;
if(y[mid]==value) return mid;
if(y[mid]<value) l = mid+;
else r = mid-;
}
return l;
}
void input(){
int x1,y1,x2,y2;
while(true){
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
if(x1==-&&x2==-&&y1==-&&y2==-) break;
rec[t].x1 = x1,rec[t].y1 = y1,rec[t].x2=x2,rec[t++].y2 = y2;
x[k] = x1,y[k++] = y1;
x[k] = x2,y[k++] = y2;
}
sort(x,x+k);
sort(y,y+k);
}
void solve(){
int t1,t2,t3,t4;
for(int i=;i<t;i++){
t1 = binary1(rec[i].x1);
t2 = binary1(rec[i].x2);
t3 = binary2(rec[i].y1);
t4 = binary2(rec[i].y2);
for(int j=t1;j<t2;j++){
for(int l = t3;l<t4;l++){
vis[j][l] = ;
}
}
}
int area = ;
for(int i=;i<k;i++){
for(int j=;j<k;j++){
area+=vis[i][j]*(x[i+]-x[i])*(y[j+]-y[j]);
}
}
printf("%d\n",area);
}
int main()
{
int x1,y1,x2,y2;
while(scanf("%d%d%d%d",&x1,&y1,&x2,&y2)!=EOF){
if(x1==-&&x2==-&&y1==-&&y2==-) break;
memset(vis,,sizeof(vis));
k=,t=;
rec[t].x1 = x1,rec[t].y1 = y1,rec[t].x2=x2,rec[t++].y2 = y2;
x[k] = x1,y[k++] = y1;
x[k] = x2,y[k++] = y2;
input();
solve();
}
return ;
}
poj 1389(离散化+计算几何)的更多相关文章
- POJ 1389 Area of Simple Polygons 扫描线+线段树面积并
---恢复内容开始--- LINK 题意:同POJ1151 思路: /** @Date : 2017-07-19 13:24:45 * @FileName: POJ 1389 线段树+扫描线+面积并 ...
- poj 1151(离散化+矩形面积并)
题目链接:http://poj.org/problem?id=1151 关于离散化,这篇博客讲的很好:http://www.cppblog.com/MiYu/archive/2010/10/15/12 ...
- POJ 1410 Intersection (计算几何)
题目链接:POJ 1410 Description You are to write a program that has to decide whether a given line segment ...
- 【POJ 1389】Area of Simple Polygons(线段树+扫描线,矩形并面积)
离散化后,[1,10]=[1,3]+[6,10]就丢了[4,5]这一段了. 因为更新[3,6]时,它只更新到[3,3],[6,6]. 要么在相差大于1的两点间加入一个值,要么就让左右端点为l,r的线段 ...
- POJ 1106 Transmitters(计算几何)
题目链接 切计算几何,感觉计算几何的算法还不熟.此题,枚举线段和圆点的直线,平分一个圆 #include <iostream> #include <cstring> #incl ...
- poj 2507Crossed ladders <计算几何>
链接:http://poj.org/problem?id=2507 题意:哪个直角三角形,一直角边重合, 斜边分别为 X, Y, 两斜边交点高为 C , 求重合的直角边长度~ 思路: 设两个三角形不重 ...
- TOYS - POJ 2318(计算几何,叉积判断)
题目大意:给你一个矩形的左上角和右下角的坐标,然后这个矩形有 N 个隔板分割成 N+1 个区域,下面有 M 组坐标,求出来每个区域包含的坐标数. 分析:做的第一道计算几何题目....使用叉积判断方 ...
- D - Mayor's posters POJ - 2528 离散化+线段树 区间修改单点查询
题意 贴海报 最后可以看到多少海报 思路 :离散化大区间 其中[1,4] [5,6]不能离散化成[1,2] [2,3]因为这样破坏了他们的非相邻关系 每次离散化区间 [x,y]时 把y+1点也加入 ...
- POJ 1654 Area 计算几何
#include<stdio.h> #include<string.h> #include<iostream> #include<math.h> usi ...
随机推荐
- requestLayout 无效
今天,listview 的requestLayout 无效. 最后,我用了 getWindow().getDecorView().requestLayout(); 可以了.
- hasOne
public boolean hasOne(int n) { int lastdigit=0; while( n >0 ){ lastdigit=(n % 10); if(lastdigit== ...
- 【Spiral Matrix】cpp
题目: Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spira ...
- 能ping通网络,也正常连接,就是打不开网页,无法访问网络
netsh winsock reset命令,作用是重置 Winsock 目录.如果一台机器上的Winsock协议配置有问题的话将会导致网络连接等问题,就需要用netsh winsock reset命令 ...
- 查看Linux系统用户登录日志
日志: /var/log/wtmp说明: 此文件是二进制文件,查看方法如下:该日志文件永久记录每个用户登录.注销及系统的启动.停机的事件.因此随着系统正常运行时间的增加,该文件的大小也会越来越大,增加 ...
- Linux认知之旅【05 进一步了解Linux装软件】!
一.Linux软件管理系统 二.Linux还可以用源码安装 三.Linux软件配置
- Java 打印* 三角形
package anli1; public class sanjiaoxing { public static void main(String[] agrs){ System.out.println ...
- Horn–Schunck 光流法与其算法理解(gup cuda)
1. 基于Horn-Schunck模型的光流算法 1.1 光流的约束条件 光流 的假设条件认为图像序列,在时间t 的某一像素点与在时间t+1的这一像素点的偏移量保持不变,即 .这就是灰度值守恒 ...
- Mac平台重新设置MySQL的root密码
Mac OS X - 重置 MySQL Root 密码 您是否忘记了Mac OS 的MySQL的root密码? 通过以下4步就可重新设置新密码: 1. 停止 mysql server. 通常是在 ...
- Spring框架jar包分类(转)
转自:http://www.cnblogs.com/JSONBEAN/p/6364038.html 长期以来都在写SSM框架的项目,却未能深入理解框架的搭建原理,而只是浅薄的理解前辈的架构,然后不断套 ...