添加lb[],rb[]数组,来标记竖边。添加num,来计算竖边的个数,因为计算周长的时候,未覆盖的竖边都要加。

#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define maxn 10010
struct seg
{
int l,r,h;
int f;
}s[maxn<<];
struct node
{
int cnt;
int num;
int len;
}tree[maxn<<];
int lb[maxn<<],rb[maxn<<];
int mark[maxn];
bool cmp(seg a,seg b)
{
return a.h < b.h;
}
void build(int l,int r,int rt)
{
tree[rt].cnt=;
tree[rt].len=;
tree[rt].num=;
if(l==r)
return ;
int m=(l+r)/;
build(lson);
build(rson);
}
void getlen(int l,int r,int rt)
{
if(tree[rt].cnt)//如果这一段被全部覆盖
{
tree[rt].len=mark[r+]-mark[l];
tree[rt].num=;//整段覆盖,那就有2条竖直的边
lb[rt]=rb[rt]=;//标记左右的竖直线段
}
else if(l==r)
{
tree[rt].num=tree[rt].len=;
lb[rt]=rb[rt]=;
}
else //未整段覆盖;
{
tree[rt].num=tree[rt<<].num+tree[rt<<|].num;
tree[rt].len=tree[rt<<].len+tree[rt<<|].len;
lb[rt]=lb[rt<<];rb[rt]=rb[rt<<|];
if(lb[rt<<|]&&rb[rt<<])//此线段已相连
tree[rt].num-=;
}
}
void updata(int L,int R,int c,int l,int r,int rt)
{
if(l>=L&&R>=r)
{
tree[rt].cnt+=c;
getlen(l,r,rt);
return ;
}
int m=(l+r)/;
if(m>=L)
updata(L,R,c,lson);
if(R>m)
updata(L,R,c,rson);
getlen(l,r,rt);
}
int find(int val,int len)
{
int l,r,m;
l=;
r=len;
while(l<=r)
{
m=(l+r)/;
if(val==mark[m])
return m;
else if(val>mark[m])
l=m+;
else r=m-;
}
return -;
}
int main()
{
int i,n,m;
while(scanf("%d",&n)!=EOF)
{
int x1,y1,x2,y2;
m = ;
for(i=;i<n;i++)
{
scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
s[m].l = x1; s[m].r = x2; s[m].h = y1; s[m].f = ; mark[m++] = x1;
s[m].l = x1; s[m].r = x2; s[m].h = y2; s[m].f = -; mark[m++] = x2;
}
sort(mark,mark+m);
sort(s,s+m,cmp);
int k = ;
for(i=;i < m;i++)
{
if(mark[i]!=mark[i-])
mark[k++]=mark[i];
}
build(,k-,);
int ans=;
int past=;
for(i=;i<m;i++)
{
int l=find(s[i].l,k-);
int r=find(s[i].r,k-)-;
updata(l,r,s[i].f,,k-,);
ans+=(tree[].num*(s[i+].h-s[i].h));
ans+=abs(tree[].len-past);
past=tree[].len;
}
printf("%d\n",ans);
}
}

hdu1828 线段树+离散化+扫描线的更多相关文章

  1. hdu1542 矩形面积并(线段树+离散化+扫描线)

    题意: 给你n个矩形,输入每个矩形的左上角坐标和右下角坐标. 然后求矩形的总面积.(矩形可能相交). 题解: 前言: 先说说做这道题的感受: 刚看到这道题顿时就懵逼了,几何 烂的渣渣.后来从网上搜题解 ...

  2. 【POJ 2482】 Stars in Your Window(线段树+离散化+扫描线)

    [POJ 2482] Stars in Your Window(线段树+离散化+扫描线) Time Limit: 1000MS   Memory Limit: 65536K Total Submiss ...

  3. POJ1151Atlantis 矩形面积并[线段树 离散化 扫描线]

    Atlantis Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 21734   Accepted: 8179 Descrip ...

  4. POJ 1151Atlantis 矩形面积并[线段树 离散化 扫描线]

    Atlantis Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 21734   Accepted: 8179 Descrip ...

  5. hdu1542线段树+离散化+扫描线

    参考博客: http://blog.csdn.net/xingyeyongheng/article/details/8927732 总的来说就是用一条(假想的)线段去平行x轴从下往上扫描,扫描的过程中 ...

  6. Picture POJ - 1177 线段树+离散化+扫描线 求交叉图像周长

    参考  https://www.cnblogs.com/null00/archive/2012/04/22/2464876.html #include <stdio.h> #include ...

  7. POJ 1177/HDU 1828 picture 线段树+离散化+扫描线 轮廓周长计算

    求n个图矩形放下来,有的重合有些重合一部分有些没重合,求最后总的不规则图型的轮廓长度. 我的做法是对x进行一遍扫描线,再对y做一遍同样的扫描线,相加即可.因为最后的轮廓必定是由不重合的线段长度组成的, ...

  8. HDU 1542 线段树离散化+扫描线 平面面积计算

    也是很久之前的题目,一直没做 做完之后觉得基本的离散化和扫描线还是不难的,由于本题要离散x点的坐标,最后要计算被覆盖的x轴上的长度,所以不能用普通的建树法,建树建到r-l==1的时候就停止,表示某段而 ...

  9. Codeforces 610D Vika and Segments 线段树+离散化+扫描线

    可以转变成上一题(hdu1542)的形式,把每条线段变成宽为1的矩形,求矩形面积并 要注意的就是转化为右下角的点需要x+1,y-1,画一条线就能看出来了 #include<bits/stdc++ ...

随机推荐

  1. 怎样对ZBrush中的材料进行渲染和着色

    ZBrush可以实时的进行不断的渲染和着色. 对于绘制操作,ZBrush®增加了新的范围尺度,可以让你给基于像素的作品增加深度,材质,光照和复杂精密的渲染特效,真正实现了 2D 与 3D 的结合,模糊 ...

  2. 分析循环 Analysis of Loops-------geeksforgeeks 翻译

    之前我们讨论了渐进分析,最佳最坏平均情况的分析以及渐进符号.在这一篇中我们分析一下迭代的简单程序. 1. O(1): 如果程序中没有包含任何的循环,递归或者任何的非常数时间的函数,我们就说这个程序的时 ...

  3. 第一次使用Android Studio时你应该知道的一切配置(三):gradle项目构建

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  4. [3D跑酷] DataManager

    DataManager管理游戏中数据,当然这个类中大部分的属性和方法都是Public 函数列表

  5. java 20 -3 递归之删除特定目录下的特定文件

    /* 需求:删除H:\demo目录下的带内容的文件 分析: A:封装该目录 B:获取该目录下所有的文件或文件夹的File数组 C:遍历该File数组,获取每一个File对象 D:判断所遍历的FIle对 ...

  6. pycharm简单使用

    http://blog.csdn.net/chenggong2dm/article/details/9365437

  7. Java连接Elasticsearch集群

    package cn.test; import java.net.InetAddress; import java.net.UnknownHostException; import org.elast ...

  8. Linux Linux程序练习六

    题目:实现一个so库文件名称为listupper.so,so文件中实现一个函数,函数名为void upper(const char *src, char *desc),调用update后将参数src所 ...

  9. 本地环境,Ecshop安装教程

    最近有个项目需要用ECshop来做,之前没接触过ECshop,今天去网上找了下安装教程,现在发出来分享一下. 1. ecshop网店系统最新版本是ECSHOP V2.7.3,去官网下载utf8和gbk ...

  10. Java Concurrency in Practice 读书笔记 第二章

    第二章的思维导图(代码迟点补上):