hdu1828 扫描线计算周长
和扫描线计算面积差不多,新加了lbd,rbd线段树来标记区间的左右两侧是否被填充(左右边界是否存在),numbd线段树统计区间有多少边
/*数据弱不用离散化,但是要处理一下坐标*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
#define maxn 20005
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1 struct Seg{
int l,r,h,s;
Seg(){}
Seg(int a,int b,int c,int d):l(a),r(b),h(c),s(d){}
bool operator<(const Seg& a)const{
if(h==a.h) return s>a.s;
return h<a.h;
}
}ss[maxn];
bool lbd[maxn<<],rbd[maxn<<];//该区间是否存在左边界,右边界,仅仅是用来判断
int numseg[maxn<<];//该区间竖边的数量(0,2)
int cnt[maxn<<];//覆盖了这一整个区间的入边-出边
int len[maxn<<];//这个区间被覆盖的长度
void pushup(int rt,int l,int r){
if(cnt[rt]){
lbd[rt]=rbd[rt]=;
len[rt]=r-l+;
numseg[rt]=;
}
else if(l==r)
len[rt]=numseg[rt]=rbd[rt]=lbd[rt]=;
else {
lbd[rt]=lbd[rt<<];
rbd[rt]=rbd[rt<<|];
len[rt]=len[rt<<]+len[rt<<|];
numseg[rt]=numseg[rt<<]+numseg[rt<<|];
if(lbd[rt<<|] && rbd[rt<<]) numseg[rt]-=;
}
}
void update(int L,int R,int c,int l,int r,int rt){
if(L<=l && R>=r){
cnt[rt]+=c;
pushup(rt,l,r);
return;
}
int m=l+r>>;
if(L<=m) update(L,R,c,lson);
if(R>m) update(L,R,c,rson);
pushup(rt,l,r);
}
int main(){
int n;
while(scanf("%d",&n)==){
int m=;
int lbd=,rbd=-;
for(int i=;i<n;i++){
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
lbd=min(lbd,a);
rbd=max(rbd,c);
ss[m++]=Seg(a,c,b,);
ss[m++]=Seg(a,c,d,-);
}
sort(ss,ss+m);
int ret=,last=;
for(int i=;i<m;i++){
if(ss[i].l<ss[i].r)
update(ss[i].l,ss[i].r-,ss[i].s,lbd,rbd,);
ret+=numseg[]*(ss[i+].h-ss[i].h);//竖边数量*区间高度
ret+=abs(len[]-last);
last=len[];
}
printf("%d\n",ret);
}
return ;
}
hdu1828 扫描线计算周长的更多相关文章
- hdu 1828 Picture(线段树扫描线矩形周长并)
		
线段树扫描线矩形周长并 #include <iostream> #include <cstdio> #include <algorithm> #include &l ...
 - 实验四 (1):定义一个形状类(Shape)方法:计算周长,计算面积
		
(1)定义一个形状类(Shape)方法:计算周长,计算面积子类:矩形类(Rectangle) :额外的方法:differ() 计算长宽差圆形类(Circle)三角形类(Triangle)正方形类(Sq ...
 - (1)定义闭合图形抽象类ClosedFigure定义属性:1.形状;2.定义构造方法,给形状赋值;3.定义两个抽象方法:计算面积和计算周长;4.定义一个显示方法:显示图像形状,周长,面积;
		
题目显示不全,完整题目描述: (1)定义闭合图形抽象类ClosedFigure定义属性:1.形状:2.定义构造方法,给形状赋值:3.定义两个抽象方法:计算面积和计算周长:4.定义一个显示方法:显示图像 ...
 - 扫描线矩形周长的并 POJ1177
		
//扫描线矩形周长的并 POJ1177 // 我是按x轴 #include <iostream> #include <cstdio> #include <cstdlib& ...
 - hdu1828 Picture(线段树+扫描线+矩形周长)
		
看这篇博客前可以看一下扫描线求面积:线段树扫描线(一.Atlantis HDU - 1542(覆盖面积) 二.覆盖的面积 HDU - 1255(重叠两次的面积)) 解法一·:两次扫描线 如图我们可以 ...
 - POJ 1177/HDU 1828 picture 线段树+离散化+扫描线 轮廓周长计算
		
求n个图矩形放下来,有的重合有些重合一部分有些没重合,求最后总的不规则图型的轮廓长度. 我的做法是对x进行一遍扫描线,再对y做一遍同样的扫描线,相加即可.因为最后的轮廓必定是由不重合的线段长度组成的, ...
 - HDU 1828 Picture(线段树扫描线求周长)
		
Picture Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...
 - N - Picture - poj 1177(扫描线求周长)
		
题意:求周长的,把矩形先进行融合后的周长,包括内周长 分析:刚看的时候感觉会跟棘手,让人无从下手,不过学过扫描线之后相信就很简单了吧(扫描线的模板- -),还是不说了,下面是一精确图,可以拿来调试数据 ...
 - POJ1177(扫描线求周长并)
		
题意:..求周长并... 解析:参考求面积并 图借鉴自:https://www.cnblogs.com/shuaiwhu/archive/2012/04/22/2464876.html 自下而上扫描 ...
 
随机推荐
- Python基础【day03】:入门知识拾遗(八)
			
本节内容 1.作用域 2.三元运算 3.进制 一.作用域 对于变量的作用域,执行声明并在内存中存在,该变量就可以在下面的代码中使用. 1 2 3 if 1==1: name = 'wupeiq ...
 - SQL2008.sa'登录失败(错误18456)
			
其实不仅仅是2008,高版本的也有这个问题.网上一大堆解决这个问题的方法,无非就是启动这个,启用那个.这里我讲些不一样的. 当你开启了TCP协议之后,需要去Windows防火墙哪里写一下入站规则,如图 ...
 - Linux命令之rmdir
			
rmdir命令 用处:删除文件夹 用法:在终端中输入rmdir加上要删除的文件夹的名字 示例: (我要删除shuyunquan这个文件夹)
 - 匿名内部类中使用的外部局部变量为什么只能是final变量
			
被匿名内部类引用的变量会被拷贝一份到内部类的环境中 但其后,在外部,该变量如果被修改,则内部外部不一致 Java为了避免数据不同步的问题,做出了匿名内部类只可以访问final的局部变量的限制. 究其原 ...
 - cdqz2017-test10-rehearsal(CDQ分治&可持久化线段树&单调栈)
			
题意: 给出n个三元组 e[i]=(si,ti,wi) 第i个三元组的价值为 Σ w[j] ,j 满足以下4个条件: 1.j<i 2.tj<ti 3.sj<si 4.不存在j< ...
 - ObservableData-另一种姿势的观察者模式
			
使用 数据的定义 public class TestModel { private static TestModel mInstance; public static TestModel GetIns ...
 - LaTeX简历模板
			
%# -*- coding:utf-8 -*- %% start of file `template_en.tex'. %% Copyright 2006-1008 Xavier Danaux (xd ...
 - Mac下使用Wine安装PowerDesigner15
			
下载: (链接: https://pan.baidu.com/s/1bpEYyIV 密码: 5ymj) 安装: 1.安装Wine 参考:http://www.cnblogs.com/EasonJim/ ...
 - json 不能 dumps datetime 解决办法
			
backend.myviews.json_time.py from datetime import date import json from datetime import datetime cla ...
 - myeclispe 一直运行debug问题
			
window->preferences->Myeclipse->Servers->Tomcat 然后找到你的相应的Tomcat服务器的版本,选中然后展开其下面的子菜单会发现有个 ...