链接

神奇的扫描线啊

估计之前刷面积并的时候太急了 没来得及理解 。。

有一大段代码是与面积并一模一样的 都是离散化 更新

面积并是扫描的x  这次也一样

因为周长只算外围的 所以扫描到一条x边时 要减去上一次扫描到的 对于Y方向上 就是与面积并不大一样的地方了

看篇带图的讲解吧 网上的题解都大同小异 估计出自一人之手

http://blog.sina.com.cn/s/blog_691ce2b7010177dz.html

它是扫描的Y  其实方法是一样的 横过来就是

对于我的代码 自己感觉不好理解在于求区间数

 #include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
using namespace std;
#define N 10010
#define LL long long
struct node
{
int lx,rx,y,d;
node(){}
node(int a,int b,int c,int d):lx(a),rx(b),y(c),d(d){}
bool operator < (const node &S) const
{
if(y == S.y) return d > S.d;
return y<S.y;
}
}mat[N];
int que[N],sum[N<<],lg[N<<],rg[N<<],seg[N<<];
int cnt[N<<];
LL ans=;
int bin(int k,int low,int high)
{
int m;
while(low<=high)
{
m = (low+high)/;
if(que[m]==k)
return m;
if(que[m]>k)
high = m-;
else
low = m+;
}
return m;
}
void up(int l,int r,int w)
{
if(cnt[w])//入边就更新这段的值 及区间数 (1个区间 2条Y边)
{
sum[w] = que[r+]-que[l];
seg[w] = ;
lg[w] = ;
rg[w] = ;
}
else if(l==r)
{
sum[w] = seg[w] = lg[w] = rg[w] = ;//出边的话 消除这条边
}
else//非出入边 向上更新 与平常线段树一样 等于子孩子相加
{
sum[w] = sum[w<<]+sum[w<<|];
seg[w] = seg[w<<]+seg[w<<|];
lg[w] = lg[w<<];
rg[w] = rg[w<<|];
if(lg[w<<|]&&rg[w<<])//左右相连 减去重复的
seg[w]-=;
}
}
void update(int a,int b,int d,int l,int r,int w)
{
if(a<=l&&b>=r)
{
cnt[w]+=d;
up(l,r,w);
return ;
}
int m = (l+r)>>;
if(a<=m)
update(a,b,d,l,m,w<<);
if(b>m)
update(a,b,d,m+,r,w<<|);
up(l,r,w);
}
int main()
{
int i,n,a,b,c,d;
while(scanf("%d",&n)!=EOF)
{
int num=;
for(i = ; i <= n ; i++)
{
scanf("%d%d%d%d",&a,&b,&c,&d);
que[num] = a;
mat[num++] = node(a,c,b,);
que[num] = c;
mat[num++] = node(a,c,d,-);
}
sort(que,que+num);
sort(mat,mat+num);
int k = ;
for(i = ; i < num ; i++)
{
if(que[i]!=que[i-])
que[k++] = que[i];
}
memset(cnt,,sizeof(cnt));
memset(sum,,sizeof(sum));
memset(lg,,sizeof(lg));
memset(rg,,sizeof(rg));
memset(seg,,sizeof(seg));
int o=;
ans=;
mat[num].y = ;
for(i = ; i < num ; i++)
{
int l = bin(mat[i].lx,,k-);
int r = bin(mat[i].rx,,k-)-;
update(l,r,mat[i].d,,k-,);
ans+=seg[]*(mat[i+].y-mat[i].y);
ans+=abs(sum[]-o);
o = sum[];
}
printf("%lld\n",ans);
}
return ;
}

poj1177Picture(线段树-周长并)的更多相关文章

  1. poj 1177 Picture(线段树周长并)

    题目链接:http://poj.org/problem?id=1177 题意:给你n个矩形问你重叠后外边缘总共多长. 周长并与面积并很像只不过是处理的时候是   增加的周长=abs(上一次的线段的长度 ...

  2. POJ 1177 Picture(线段树周长并)

      描述 A number of rectangular posters, photographs and other pictures of the same shape are pasted on ...

  3. HDU 1828 / POJ 1177 Picture --线段树求矩形周长并

    题意:给n个矩形,求矩形周长并 解法:跟求矩形面积并差不多,不过线段树节点记录的为: len: 此区间线段长度 cover: 此区间是否被整个覆盖 lmark,rmark: 此区间左右端点是否被覆盖 ...

  4. HDU 1828 / POJ 1177 Picture (线段树扫描线,求矩阵并的周长,经典题)

    做这道题之前,建议先做POJ 1151  Atlantis,经典的扫描线求矩阵的面积并 参考连接: http://www.cnblogs.com/scau20110726/archive/2013/0 ...

  5. hdu 1828 线段树扫描线(周长)

    Picture Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  6. hdu 1828 Picture(线段树扫描线矩形周长并)

    线段树扫描线矩形周长并 #include <iostream> #include <cstdio> #include <algorithm> #include &l ...

  7. 51nod 1206 Picture 矩形周长求并 | 线段树 扫描线

    51nod 1206 Picture 矩形周长求并 | 线段树 扫描线 #include <cstdio> #include <cmath> #include <cstr ...

  8. POJ 1177 Picture(线段树:扫描线求轮廓周长)

    题目链接:http://poj.org/problem?id=1177 题目大意:若干个矩形,求这些矩形重叠形成的图形的轮廓周长. 解题思路:这里引用一下大牛的思路:kuangbin 总体思路: 1. ...

  9. luogu P1856 [USACO5.5]矩形周长Picture 扫描线 + 线段树

    Code: #include<bits/stdc++.h> #define maxn 200007 #define inf 100005 using namespace std; void ...

随机推荐

  1. NOIP200701

    题是这样的: 试题描述 某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金.期末,每个学生都有3门课的成绩:语文.数学.英语.先按总分从高到低排序,如果两个同学总分相同,再 ...

  2. Trie,HDU1875world puzzle

    附上代码 #include<iostream> #include<cstdio> #include<string> #include<cstring> ...

  3. 关于JSON对象,以及联合数组,eval函数的使用参考

    关于JSON对象,以及联合数组,eval函数的使用参考 var json="{persons:[{name:'Zhangsan',sex:'male'},{name:'Lisi',sex:' ...

  4. VMware10.0.4下 CentOS 6.5 cmake安装 MySQL 5.5.32

    一.准备工作 1.1.创建 zhuzz/tools目录 [root@localhost ~]# mkdir -p /home/zhuzz/tools [root@localhost ~]# cd /h ...

  5. Mysql存储引擎__笔记

    Mysql存储引擎(表类型): Mysql数据库: 通常意义上,数据库也就是数据的集合,具体到计算机上数据库可以使存储器上一些文件的集合或者一些内存 数据的内存数据的集合. Mysql数据库是开放源代 ...

  6. 【HeadFirst设计模式】7.适配器模式与外观模式

    今晚学习完第七章,顺便做一下知识备忘. 适配器模模式: 定义:将一个类的接口,转换成客户期望的另一个接口.适配器让原本接口不兼容的类可以合作无间. 对象适配器: 类适配器: 外观模式: 提供了一个统一 ...

  7. display:block; 块级元素。<a>,<span>标签设置宽度和高度

    display:block;是让对象成为块级元素(比如a,span等) 转化后 可以对a或者span标签进行width和height设置,否则设置不了 display有很多对象,具体可以参考http: ...

  8. composer php依赖管理工具

    #composer是什么 Composer 是 PHP 的一个依赖管理工具.它允许你申明项目所依赖的代码库,它会在你的项目中为你安装他们. composer出现之前我们php项目依赖管理大部分都是手动 ...

  9. delphi xe5 android 关于文件大小的几个问答O(∩_∩)O~

    摘自:http://blogs.embarcadero.com/vsevolodleonov/2013/09/19/are-you-asking-about-app-size-by-delphi-fo ...

  10. 设计的SOA架构

    新来老大年前开会说各位同学,公司业务越来越重,未来几年要成倍增长......,要梳理出一套新架构,才能更好的支持N万用户.....,以后升职加薪当上....打败..... 想想还有点小激动呢,于是过年 ...