原题

线段树+扫描线

对于这样一个不规则图形,我们要求他的面积有两种方法,割和补。

补显然不行,因为补完你需要求补上去的内部分不规则图形面积……

那么怎么割呢?

像这样:

我们就转化成了无数个矩形的和。要想求这些矩形的面积,也就是底成高。因为我们并不懂什么二维线段树,所以我们就用“扫描线”(从左到右的更新计算)。

不妨把y轴当做一个线段树,然后维护哪些位置被覆盖了,直到下一条更新,所增加的面积就是被覆盖位置(高)和这两个距离的差(底)的乘积。

Eg:



我们第一次更新建了第一条边的树,第二次更新时就可以增加这么多的长度。

然后我们考虑这样一个情况,如果某个位置被覆盖了很多次怎么办,显然我们线段树的维护是不能将它重复计算多次的,那么我们就加一个cover数组,来记录当前区间被覆盖过多少次,那样在做下面这样的更新时就不会出错。

接下来来理解代码把~!

#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 1010
#define M 60010
using namespace std;
int x1,y1,x2,y2,s[4*M],cov[4*M],ans,tot,mxy;
struct hhh
{
int x,yf,yb,k;
bool operator < (const hhh &b) const
{
if (x==b.x) return k<b.k;
return x<b.x;
}
}a[2*N]; int read()
{
int ans=0,fu=1;
char j=getchar();
for (;(j<'0' || j>'9') && j!='-';j=getchar()) ;
if (j=='-') j=getchar();
for (;j>='0' && j<='9';j=getchar()) ans*=10,ans+=j-'0';
return ans*fu;
} void modify(int i,int l,int r,int x,int y,int k)
{
if (x<=l && y>=r)
{
cov[i]+=k;
if (cov[i]) s[i]=r-l+1;
else if (l==r) s[i]=0;
else s[i]=s[i*2]+s[i*2+1];
}
else
{
int mid=(l+r)>>1;
if (x<=mid) modify(i*2,l,mid,x,y,k);
if (y>mid) modify(i*2+1,mid+1,r,x,y,k);
if (!cov[i]) s[i]=s[i*2]+s[i*2+1];
}
} int main()
{
while (~scanf("%d%d%d%d",&x1,&y1,&x2,&y2))
{
mxy=0;
tot=1;
if (x1==-1 && y1==-1 && x2==-1 && y2==-1) break;
memset(cov,0,sizeof(cov));
memset(s,0,sizeof(s));
while (1)
{
if (x1==-1 && y1==-1 && x2==-1 && y2==-1) break;
mxy=max(mxy,y2);
a[tot].x=x1;a[tot].yf=y1;a[tot].yb=y2;a[tot++].k=1;
a[tot].x=x2;a[tot].yf=y1;a[tot].yb=y2;a[tot++].k=-1;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
}
sort(a+1,a+tot);
ans=0;
modify(1,0,mxy,a[1].yf+1,a[1].yb,a[1].k);
for (int i=2;i<tot;i++)
{
ans+=s[1]*(a[i].x-a[i-1].x);
modify(1,0,mxy,a[i].yf+1,a[i].yb,a[i].k);
}
printf("%d\n",ans);
}
return 0;
}

[poj] 1389 Area of Simple Polygons的更多相关文章

  1. POJ 1389 Area of Simple Polygons 扫描线+线段树面积并

    ---恢复内容开始--- LINK 题意:同POJ1151 思路: /** @Date : 2017-07-19 13:24:45 * @FileName: POJ 1389 线段树+扫描线+面积并 ...

  2. POJ 1389 Area of Simple Polygons | 扫描线

    请戳此处 #include<cstdio> #include<algorithm> #include<cstring> #define N 1010 #define ...

  3. POJ Area of Simple Polygons 扫描线

    这个题lba等神犇说可以不用离散化,但是我就是要用. 题干: Description There are N, <= N <= , rectangles -D xy-plane. The ...

  4. 【POJ 1389】Area of Simple Polygons(线段树+扫描线,矩形并面积)

    离散化后,[1,10]=[1,3]+[6,10]就丢了[4,5]这一段了. 因为更新[3,6]时,它只更新到[3,3],[6,6]. 要么在相差大于1的两点间加入一个值,要么就让左右端点为l,r的线段 ...

  5. Area of Simple Polygons

    poj1389:http://poj.org/problem?id=1389 题意:求矩形面积的并题解:扫描线加线段树 同poj1389 #include<iostream> #inclu ...

  6. POJ1389:Area of Simple Polygons——扫描线线段树题解+全套代码注释

    http://poj.org/problem?id=1389 题面描述在二维xy平面中有N,1 <= N <= 1,000个矩形.矩形的四边是水平或垂直线段.矩形由左下角和右上角的点定义. ...

  7. POJ1389 Area of Simple Polygons 线段树

    POJ1389 给定n个整数点矩形,求面积并. 显然ans必然是整数. 记录若干个事件,每个矩形的左边的竖边记为开始,右边的竖边记为结束. 进行坐标离散化后用线段树维护每个竖的区间, 就可以快速积分了 ...

  8. poj 1389(离散化+计算几何)

    Area of Simple Polygons Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3412   Accepted ...

  9. poj 1265 Area 面积+多边形内点数

    Area Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5861   Accepted: 2612 Description ...

随机推荐

  1. 第34-1题:LeetCode112. Path Sum I

    题目 给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和. 说明: 叶子节点是指没有子节点的节点. 示例:  给定如下二叉树,以及目标和 sum ...

  2. 使用docker搭建“企业级镜像仓库”Harbor

    一.前沿 docker的官方镜像仓库registry,功能比较单一,不太好用,特别是删除镜像操作,不够友好. Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,通过添加一 ...

  3. 如何在maven中的项目使用tomcat插件

    在pom.xml中引入tomcat7插件,具体示例代码如下: <project> <build> <plugins> <plugin> <grou ...

  4. 初试PHP连接sql server

    最开始想使用 pdo_sqlsrv 拓展,但是一直没成功,本文采用的是 pdo_dblib + freetds. 环境:CentOS 6.8.PHP 5.6.20 freetds wget ftp:/ ...

  5. 提高mysql性能(like搜索替换 )

    一 .mysql用find_in_set代替like搜索提高性能 SELECT * from mobantestinfo1 where find_in_set('33',info2); 二 .使用内部 ...

  6. VUE前端无法启动

    cd 到client中,使用npm run dev ,一直卡着也不报错,启动不了项目 可以直接使用 ,需要进入root目录进行 cnpm install npm -g

  7. Android 中的反调试技术

    比较简单的有下面这两种 调试端口检测, 23946(0x5D8A) Demo: void CheckPort23946ByTcp() { FILE* pfile=NULL; char buf[0x10 ...

  8. 用for循环计算(1-3+5-7...99)的结果(两种方法)

    1) sum=0 count=1 for i in range(1,100,2): if count % 2==0: sum = sum - i else: sum = sum + i count = ...

  9. hihocoder #1394 : 网络流四·最小路径覆盖(最小路径覆盖)

    #1394 : 网络流四·最小路径覆盖 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 国庆期间正是旅游和游玩的高峰期. 小Hi和小Ho的学习小组为了研究课题,决定趁此机 ...

  10. 通俗版解释网关,IP地址,ARP欺骗,DDOS攻击

    计算机主机网关的作用是什么? 假设你的名字叫小不点,你住在一个大院子里,你的邻居有很多小伙伴,在门口传达室还有个看大门的李大爷,李大爷就是你的网关.当你想跟院子里的某个小伙伴玩,只要你在院子里大喊一声 ...