hdu1828 线段树+离散化+扫描线
添加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 线段树+离散化+扫描线的更多相关文章
- hdu1542 矩形面积并(线段树+离散化+扫描线)
题意: 给你n个矩形,输入每个矩形的左上角坐标和右下角坐标. 然后求矩形的总面积.(矩形可能相交). 题解: 前言: 先说说做这道题的感受: 刚看到这道题顿时就懵逼了,几何 烂的渣渣.后来从网上搜题解 ...
- 【POJ 2482】 Stars in Your Window(线段树+离散化+扫描线)
[POJ 2482] Stars in Your Window(线段树+离散化+扫描线) Time Limit: 1000MS Memory Limit: 65536K Total Submiss ...
- POJ1151Atlantis 矩形面积并[线段树 离散化 扫描线]
Atlantis Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 21734 Accepted: 8179 Descrip ...
- POJ 1151Atlantis 矩形面积并[线段树 离散化 扫描线]
Atlantis Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 21734 Accepted: 8179 Descrip ...
- hdu1542线段树+离散化+扫描线
参考博客: http://blog.csdn.net/xingyeyongheng/article/details/8927732 总的来说就是用一条(假想的)线段去平行x轴从下往上扫描,扫描的过程中 ...
- Picture POJ - 1177 线段树+离散化+扫描线 求交叉图像周长
参考 https://www.cnblogs.com/null00/archive/2012/04/22/2464876.html #include <stdio.h> #include ...
- POJ 1177/HDU 1828 picture 线段树+离散化+扫描线 轮廓周长计算
求n个图矩形放下来,有的重合有些重合一部分有些没重合,求最后总的不规则图型的轮廓长度. 我的做法是对x进行一遍扫描线,再对y做一遍同样的扫描线,相加即可.因为最后的轮廓必定是由不重合的线段长度组成的, ...
- HDU 1542 线段树离散化+扫描线 平面面积计算
也是很久之前的题目,一直没做 做完之后觉得基本的离散化和扫描线还是不难的,由于本题要离散x点的坐标,最后要计算被覆盖的x轴上的长度,所以不能用普通的建树法,建树建到r-l==1的时候就停止,表示某段而 ...
- Codeforces 610D Vika and Segments 线段树+离散化+扫描线
可以转变成上一题(hdu1542)的形式,把每条线段变成宽为1的矩形,求矩形面积并 要注意的就是转化为右下角的点需要x+1,y-1,画一条线就能看出来了 #include<bits/stdc++ ...
随机推荐
- 怎样对ZBrush中的材料进行渲染和着色
ZBrush可以实时的进行不断的渲染和着色. 对于绘制操作,ZBrush®增加了新的范围尺度,可以让你给基于像素的作品增加深度,材质,光照和复杂精密的渲染特效,真正实现了 2D 与 3D 的结合,模糊 ...
- 分析循环 Analysis of Loops-------geeksforgeeks 翻译
之前我们讨论了渐进分析,最佳最坏平均情况的分析以及渐进符号.在这一篇中我们分析一下迭代的简单程序. 1. O(1): 如果程序中没有包含任何的循环,递归或者任何的非常数时间的函数,我们就说这个程序的时 ...
- 第一次使用Android Studio时你应该知道的一切配置(三):gradle项目构建
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- [3D跑酷] DataManager
DataManager管理游戏中数据,当然这个类中大部分的属性和方法都是Public 函数列表
- java 20 -3 递归之删除特定目录下的特定文件
/* 需求:删除H:\demo目录下的带内容的文件 分析: A:封装该目录 B:获取该目录下所有的文件或文件夹的File数组 C:遍历该File数组,获取每一个File对象 D:判断所遍历的FIle对 ...
- pycharm简单使用
http://blog.csdn.net/chenggong2dm/article/details/9365437
- Java连接Elasticsearch集群
package cn.test; import java.net.InetAddress; import java.net.UnknownHostException; import org.elast ...
- Linux Linux程序练习六
题目:实现一个so库文件名称为listupper.so,so文件中实现一个函数,函数名为void upper(const char *src, char *desc),调用update后将参数src所 ...
- 本地环境,Ecshop安装教程
最近有个项目需要用ECshop来做,之前没接触过ECshop,今天去网上找了下安装教程,现在发出来分享一下. 1. ecshop网店系统最新版本是ECSHOP V2.7.3,去官网下载utf8和gbk ...
- Java Concurrency in Practice 读书笔记 第二章
第二章的思维导图(代码迟点补上):