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++ ...
随机推荐
- java方法可变参数的写法
jdk1.5之后出现的,该写法避免了当有多个不同个数的参数方法时,对方法的重载.其实就是数组. package com.shipin; /** * @author QiaoJiafei * @vers ...
- HDU 4930 Fighting the Landlords --多Trick,较复杂模拟
题意:两个人A和B在打牌,只有题目给出的几种牌能出若A第一次出牌B压不住或者A一次就把牌出完了,那么A赢,输出Yes,否则若A牌没出完而且被B压住了,那么A输,输出No. 解法:知道规则,看清题目,搞 ...
- ehcache 一二事 - ssm 中ehcashe的简单配置应用
Ehcache是一个开源Java分布式缓存.可以配合mybatis来使用 首先,在资源文件夹中新建ehcache.xml 内容如下: <?xml version="1.0&qu ...
- JavaWeb学习----JSP简介及入门(含Eclipse for Java EE及Tomcat的配置)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- jsp 微信公众平台 token验证(php、jsp)(转载)
微信公众平台现在推出自动回复消息接口,但是由于是接口内容用的是PHP语言写的,很多地方操作起来让本人这个对java比较熟悉的小伙很别扭,所以仿照PHP的接口代码做了一套jsp语言编写的接口. 首先先把 ...
- Web知识总结
一)window.location.href和window.location.replace的区别 1.window.location.href=“url”:改变url地址: 2.window.loc ...
- [转]Nginx+ThinkPHP不支持PathInfo的解决办法
FROM : http://www.4wei.cn/archives/1001174 应集团要求,公司的服务器全收到集团机房统一管理了,失去了服务器的管理配置权限. 杯具就此开始. 首先要解决文件大小 ...
- ip routing&no ip routing
ip routing--------查路由表, 如果ping的目的在RT中没有,不发出任何包(arp也不会发出) 如果RT中存在,则arp 下一跳,相当于no ip routing+配置网关 n ...
- C语言 简单的栈
//简单的栈 #include<stdio.h> #include<stdlib.h> //栈的介绍:栈先进后出,一般用于将数据逆序输出 //栈一般只有四种方法--进栈,出栈, ...
- c++中二进制和整数转化
#1,包含文件 #include<bitset> #2,整数转化成二进制 int a = 63; bitset<6> bs(a); #3,二进制转化成整数 int b = bs ...