hdu 1828 Picture(线段树扫描线矩形周长并)
线段树扫描线矩形周长并
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#define MAXN 22222
using namespace std; int len[MAXN<<2];
bool lbd[MAXN<<2],rbd[MAXN<<2];
int numseg[MAXN<<2];
int cnt[MAXN<<2]; struct line
{
int s,e,h,type; }L[MAXN]; bool cmp(line a,line b)
{
if(a.h==b.h)return a.type>b.type;
return a.h<b.h;
} void pushup(int num,int l,int r)
{
if(cnt[num])//全部覆盖
{
lbd[num]=rbd[num]=1;
len[num]=r-l+1;
numseg[num]=2;
}
else if(l==r)//没有完全覆盖 且L==R 不就意味着没有东西在它上面么
{
lbd[num]=rbd[num]=numseg[num]=len[num]=0;
}
else
{
lbd[num]=lbd[num<<1];
rbd[num]=rbd[num<<1|1];
len[num]=len[num<<1]+len[num<<1|1];
numseg[num]=numseg[num<<1] + numseg[num<<1|1];
if(rbd[num<<1] && lbd[num<<1|1])numseg[num]-=2;//重合
}
} void update(int num,int s,int e,int l,int r,int val)
{
if(l<=s && r>=e)
{
cnt[num]+=val;
pushup(num,s,e);
return;
}
int mid=(s+e)>>1; if(l<=mid)update(num<<1,s,mid,l,r,val);
if(r>mid)update(num<<1|1,mid+1,e,l,r,val);
pushup(num,s,e);
} int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int lmost=10000,rmost=-10000;
int m=0;
for(int i=1;i<=n;i++)
{
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
lmost=min(lmost,a);
rmost=max(rmost,c);
L[m].s=a;L[m].e=c;L[m].h=b;L[m++].type=1;
L[m].s=a;L[m].e=c;L[m].h=d;L[m++].type=-1;
}
sort(L,L+m,cmp);
int ans=0;
int last=0;//记录更新之前的X周的覆盖区域
for(int i=0;i<m;i++)
{
if(L[i].s<L[i].e)update(1,lmost,rmost-1,L[i].s,L[i].e-1,L[i].type);
ans+=numseg[1]*(L[i+1].h-L[i].h);//计算竖直方向的长度
ans+=abs(len[1]-last);
last = len[1];
}
printf("%d\n",ans);
}
}
hdu 1828 Picture(线段树扫描线矩形周长并)的更多相关文章
- hdu1828 Picture(线段树+扫描线+矩形周长)
看这篇博客前可以看一下扫描线求面积:线段树扫描线(一.Atlantis HDU - 1542(覆盖面积) 二.覆盖的面积 HDU - 1255(重叠两次的面积)) 解法一·:两次扫描线 如图我们可以 ...
- HDU 1828 Picture (线段树+扫描线)(周长并)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1828 给你n个矩形,让你求出总的周长. 类似面积并,面积并是扫描一次,周长并是扫描了两次,x轴一次,y ...
- HDU 1828 Picture (线段树:扫描线周长)
依然是扫描线,只不过是求所有矩形覆盖之后形成的图形的周长. 容易发现,扫描线中的某一条横边对答案的贡献. 其实就是 加上/去掉这条边之前的答案 和 加上/去掉这条边之后的答案 之差的绝对值 然后横着竖 ...
- POJ 1177/HDU 1828 picture 线段树+离散化+扫描线 轮廓周长计算
求n个图矩形放下来,有的重合有些重合一部分有些没重合,求最后总的不规则图型的轮廓长度. 我的做法是对x进行一遍扫描线,再对y做一遍同样的扫描线,相加即可.因为最后的轮廓必定是由不重合的线段长度组成的, ...
- HDU 1828 / POJ 1177 Picture --线段树求矩形周长并
题意:给n个矩形,求矩形周长并 解法:跟求矩形面积并差不多,不过线段树节点记录的为: len: 此区间线段长度 cover: 此区间是否被整个覆盖 lmark,rmark: 此区间左右端点是否被覆盖 ...
- hdu 1828 Picture(线段树 || 普通hash标记)
http://acm.hdu.edu.cn/showproblem.php?pid=1828 Picture Time Limit: 6000/2000 MS (Java/Others) Mem ...
- hdu 1828 Picture(线段树轮廓线)
Picture Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- HDU 1264 Counting Squares (线段树-扫描线-矩形面积并)
版权声明:欢迎关注我的博客.本文为博主[炒饭君]原创文章,未经博主同意不得转载 https://blog.csdn.net/a1061747415/article/details/25471349 P ...
- HDU 1542 - Atlantis - [线段树+扫描线]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1542 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...
随机推荐
- Android 截屏与 WebView 长图分享经验总结
最近在做新业务需求的同时,我们在 Android 上遇到了一些之前没有碰到过的问题,截屏分享. WebView 生成长图以及长图在各个分享渠道分享时图片模糊甚至分享失败等问题,在这过程中踩了很多坑,到 ...
- oracle进阶之connect by笔记
本博客是自己在学习和工作途中的积累与总结,仅供自己参考,也欢迎大家转载,转载时请注明出处. http://www.cnblogs.com/king-xg/p/6794562.html 如果觉得对您有帮 ...
- 根据条件返回相应值 decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)
decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值) [功能]根据条件返回相应值 [参数]c1, c2, ...,cn,字符型/数值型/日期型,必须类型相同或null 注 ...
- hdu5646数学构造+二分
/* 满足n>=(k+1)*k/2的整数n必定满足 a+(a+1)+...+(a+k-1)<=n<=(a+1)+(a+2)+...+(a+k) 只要在[a,a+k]中减掉一个数字ai ...
- MySQL重复数据处理
最近工作很忙,很久没写博客,嘻嘻!今天写一遍关于MySQL重复数据处理的博客!前不久有个开发问我,能不能把重复的数据去除,留下唯一的数据.然后我问他为什么有这么重复的数据呢,他说写了程序去爬数据,爬到 ...
- Gitlab库已损坏前端显示500错误解决方法
1.问题起因 办公网机房意外断掉,导致gitlab库文件损坏.开发打开gitlab显示500 2.查看日志 命令查看:gitlab-ctl tail 或者手动查看:/var/log/gitlab/gi ...
- HDU 2594 最长相同前后缀
Sample Inputclintonhomerriemannmarjorie Sample Output0rie 3 输入两个字符串 ,求最长相同前后缀直接把两个字符串连接在一起求next就行了,唯 ...
- AOJ 2224 Save your cats (Kruskal)
题意:给出一个图,去除每条边的花费为边的长度,求用最少的花费去除部分边使得图中无圈. 思路:先将所有的边长加起来,然后减去最大生成树,即得出最小需要破坏的篱笆长度. #include <cstd ...
- ajax请求正常,返回json格式,后台没问题,浏览器500
1.使用的是springmvc中的 @ResponseBody 注解 ,后台不报错,.正常走完:以为使用这个注解就可以正常返回json格式的数据:所以一直没有怀疑是注解的问题: 以为是ajax本身 ...
- java web开发阅读笔记:第一章
学习该书前所用推荐书籍<名师讲坛—java开发实战经典> 一web开发前奏 1.1网页发展 首先搞懂. 1.HTTP:超级文本传输协议,是一种通讯协议. 通过这个网络协议WW浏览器与WWW ...