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 ...
随机推荐
- python抓取bing主页背景图片
最初Python2写法: #!/usr/bin/env python # -*- coding:utf-8 -*- # -*- author:nancy -*- # python2抓取bing主页所有 ...
- MACE(3)-----工程化
作者:十岁的小男孩 QQ:929994365 能下者,上. 前言 本文是MACE的第三步即MACE环境编译出来的库在Android工程中的使用.在第一篇博文中通过mace官方提供的安卓工程进行调试,本 ...
- PHP魔术方法实例
PHP中把以两个下划线__开头的方法称为魔术方法,这些方法在PHP中充当了举足轻重的作用. 魔术方法包括: __construct(),类的构造函数 __destruct(),类的析构函数 __cal ...
- openstack Too many open files错误
oopenstack突然web页面无法打开,页面报500错误,查看httpd日志报如下错误 [Fri Feb ::] [:error] [pid ] [remote ] IOError: [Errno ...
- POJ3348 Cows 计算几何 凸包
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - POJ3348 题意概括 求凸包面积(答案÷50) 题解 凸包裸题. 代码 #include <cstr ...
- 二分搜索-poj2785
题目链接:http://poj.org/problem?id=2785 题目大意:要求输入A,B,C,D四个数组,从每个数组中分别取出一个数来相加,求出相加后 和为0 总共有多少种加法. #inclu ...
- 《Java并发编程的艺术》--Java中的锁
No1: Lock接口 Lock lock = new ReentrantLock(); lock.lock(); try{ }finally{ lock.unlock(); } No2: 不要讲获取 ...
- Loader监听数据源的变化
步骤: 1.新建一个继承SQLiteOpenHelper的帮助类 2.在MainActivity中定义LoaderManager和SimpleCursorAdapter 3.按顺序重写如下方法:ini ...
- Session丢失的解决方法
1.修改配置文件 <sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:4 ...
- Web大前端面试题-Day12
1.前端需要注意哪些SEO? 合理的title.description.keywords: 搜索对着三项的权重逐个减小, title值强调重点即可, 重要关键词出现不要超过2次, 而且要靠前, 不同页 ...