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++ ...
随机推荐
- smarty插件开发代替注册插件方法registerPlugin
- 利用exif.js解决ios手机上传竖拍照片旋转90度问题
html5+canvas进行移动端手机照片上传时,发现ios手机上传竖拍照片会逆时针旋转90度,横拍照片无此问题:Android手机没这个问题. 因此解决这个问题的思路是:获取到照片拍摄的方向角,对非 ...
- C语言 const常量讲解
//const的本质 //const本质上是伪常量,无法用于数组初始化以及全局变量初始化 //原因在于const仅仅限定变量无法直接赋值,但是却可以通过指针间接赋值 //例如局部常量在栈区,而不在静态 ...
- cookie+memcached实现单点登陆
10年的时候在iteye的第一篇文章记录了一下当时怎么实现我们系统的单点登陆.不过那个时候文章写的不好,思路也很浮躁,很难看懂,在csdn的第一篇技术博客打算重新温顾一下当时实现单点登陆的思路.先来看 ...
- Objective-c文件读取
- 20135220谈愈敏Blog7_可执行程序的装载
可执行程序的装载 谈愈敏 原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 一. ...
- HDU5802-windows 10-dfs+贪心
音量减的时候,分两种,一种是减到大于目标M,另一种是减到小于M,停顿的时候可以减少最后往上加的次数,小于0的时候变成0 然后比一下这两种的最小值. /*------------------------ ...
- 开发一个简单实用的android紧急求助软件
之前女朋友一个人住,不怎么放心,想找一个紧急求助的软件,万一有什么突发情况,可以立即知道.用金山手机卫士的手机定位功能可以知道对方的位置状态,但不能主动发送求助信息,在网上了很多的APK,都是鸡肋功能 ...
- Javascript设计模式之我见:状态模式
大家好!本文介绍状态模式及其在Javascript中的应用. 模式介绍 定义 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式主要解决的是控制一个对象状态的条件表达式 ...
- 通通的最后一篇博客(附自制html5平面射击小游戏一枚)
这是我最后一篇博客了,由于本人的人生规划吧,以后应该也写不出什么好的技术文章了,到现在在博客园写了2年, 今天一看,我也有了120个粉丝,好几万的浏览量,感谢大家的支持啊~~ 半年没有写博客了,由于半 ...