poj1177 矩形周长并
线段树扫描线的模板题,一个月前写的发现忘了一些还是要看看以前的博客呀!
/*
思路:数据小不用离散化处理,线段树叶子结点维护一个区间
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
#define maxn 20005
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<<],cnt[maxn<<],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]-=;
}
}
#define lson l,m,rt<<1
#define rson m,r,rt<<1|1
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);
}
void init(){
memset(lbd,,sizeof lbd);
memset(rbd,,sizeof rbd);
memset(cnt,,sizeof cnt);
memset(len,,sizeof len);
memset(numseg,,sizeof numseg);
}
int main(){
int n;
while(scanf("%d",&n)==){
init();
int m=,x1,y1,x2,y2,lbd=,rbd=-,last=,ans=;
for(int i=;i<=n;i++){
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
ss[m++]=Seg(x1,x2,y1,);
ss[m++]=Seg(x1,x2,y2,-);
lbd=min(lbd,x1),rbd=max(rbd,x2);
}
sort(ss,ss+m);
for(int i=;i<m;i++){
update(ss[i].l,ss[i].r,ss[i].s,lbd,rbd,);
ans+=abs(len[]-last);last=len[];
ans+=numseg[]*(ss[i+].h-ss[i].h);
}
printf("%d\n",ans);
}
return ;
}
poj1177 矩形周长并的更多相关文章
- 扫描线矩形周长的并 POJ1177
//扫描线矩形周长的并 POJ1177 // 我是按x轴 #include <iostream> #include <cstdio> #include <cstdlib& ...
- 25.按要求编写一个Java应用程序: (1)编写一个矩形类Rect,包含: 两个属性:矩形的宽width;矩形的高height。 两个构造方法: 1.一个带有两个参数的构造方法,用于将width和height属性初化; 2.一个不带参数的构造方法,将矩形初始化为宽和高都为10。 两个方法: 求矩形面积的方法area() 求矩形周长的方法perimeter() (2)通过继承Rect类编写一个具有
package zhongqiuzuoye; //自己写的方法 public class Rect { public double width; public double height; Rect( ...
- HDU 1828 / POJ 1177 Picture --线段树求矩形周长并
题意:给n个矩形,求矩形周长并 解法:跟求矩形面积并差不多,不过线段树节点记录的为: len: 此区间线段长度 cover: 此区间是否被整个覆盖 lmark,rmark: 此区间左右端点是否被覆盖 ...
- HDU 1828 扫描线(矩形周长并)
Picture Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- HDU 6362(求椭圆中矩形周长的期望 数学)
题意是给定一个椭圆标准方程的a,b(椭圆的长半轴长和短半轴长),在[0,b]内取一个数,则过点(0,b)且平行于x轴的直线与椭圆交于两点,再将此两点关于x轴做对称点,顺次连接此四点构成矩形,求出这些矩 ...
- hdu 1828 Picture(线段树扫描线矩形周长并)
线段树扫描线矩形周长并 #include <iostream> #include <cstdio> #include <algorithm> #include &l ...
- 51nod 1206 Picture 矩形周长求并 | 线段树 扫描线
51nod 1206 Picture 矩形周长求并 | 线段树 扫描线 #include <cstdio> #include <cmath> #include <cstr ...
- P1856 [USACO5.5]矩形周长Picture
P1856 [USACO5.5]矩形周长Picture $len$ $sum$ $num$ $flag\_l$ $flage\_ ...
- P1856 [USACO5.5]矩形周长Picture[扫描线]
题目背景 墙上贴着许多形状相同的海报.照片.它们的边都是水平和垂直的.每个矩形图片可能部分或全部的覆盖了其他图片.所有矩形合并后的边长称为周长. 题目描述 编写一个程序计算周长. 如图1所示7个矩形. ...
随机推荐
- JS控制CSS3,添加浏览器兼容前缀
不同浏览器对于有些css3属性名字定义的时候,会带上特有的前缀,所以在css编写的时候,经常会一个属性写多个不同的前缀进行兼容.比如: div { transform: rotate(30deg); ...
- 把svn上的mycelipse导到本地的eclipse中【原】
myeclipse和eclipse的web项目互导时会产生各种问题,现在把我遇到的情况记录如下: eclipse如何把svn上down下来的myeclipseWeb项目变成eclipse的Web项目: ...
- C#中子线程操作主线程中窗体上控件的方法
Demo this.listView1.Visible = true; this.listView1.BeginUpdate();this.listView1.EndUpdate(); //结束数据处 ...
- Nginx 学习笔记(二)Web 服务启用 HTTP/2
个人网站提升为HTTP2.0协议,加速访问 一.条件 1.openssl的版本必须在1.0.2e及以上 2.nginx的版本必须在1.9.5以上 二.编译安装 1.openssl 编译安装 (1)开始 ...
- .NET面试题系列(十二)Dictionary原理
序言 Dictionary Dictionary的开发人员都了解,和List相比,字典添加会慢,但是查找会比较快. Dictionary的本质 --- 两个数组.这是典型的用空间换取时间的做法. 先来 ...
- DotNetBar TextBoxDropDown响应按键事件
textBoxDropDownHelp.TextBox.KeyDown += new KeyEventHandler(textBoxDropDownHelp_KeyDown); private voi ...
- JDBC preparedStatement分页和统计,批处理和事务
一个类:DriverManager 四个接口:Connection.PreparedStatement .ResultSet.Statement 连接不上数据库出错的原因 1.数据库监听服务的配置不正 ...
- 解决virtualbox与mac文件拖拽问题
apt-get purge virtualbox-guest-x11apt-get autoremove --purgerebootapt-get updateapt-get dist-upgrade ...
- Ubuntu 18.04换国内源 中科大源 阿里源 163源 清华源
感觉还是18.4好用,所以最近装回了18,感觉现在18的兼容性也还可以了,深度学习的环境配置都没有问题,就是安装软件的时候有点慢,所以想要更新一下源. 第一步: 编辑/etc/apt/sources. ...
- 第15月第22天 libz.dylib
1. 3.在弹出的对话框中输入"cmd"+"shift"+"g" 4 4.输入/usr/lib https://jingyan.baidu. ...