poj1177Picture(线段树-周长并)
神奇的扫描线啊
估计之前刷面积并的时候太急了 没来得及理解 。。
有一大段代码是与面积并一模一样的 都是离散化 更新
面积并是扫描的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(线段树-周长并)的更多相关文章
- poj 1177 Picture(线段树周长并)
题目链接:http://poj.org/problem?id=1177 题意:给你n个矩形问你重叠后外边缘总共多长. 周长并与面积并很像只不过是处理的时候是 增加的周长=abs(上一次的线段的长度 ...
- POJ 1177 Picture(线段树周长并)
描述 A number of rectangular posters, photographs and other pictures of the same shape are pasted on ...
- HDU 1828 / POJ 1177 Picture --线段树求矩形周长并
题意:给n个矩形,求矩形周长并 解法:跟求矩形面积并差不多,不过线段树节点记录的为: len: 此区间线段长度 cover: 此区间是否被整个覆盖 lmark,rmark: 此区间左右端点是否被覆盖 ...
- HDU 1828 / POJ 1177 Picture (线段树扫描线,求矩阵并的周长,经典题)
做这道题之前,建议先做POJ 1151 Atlantis,经典的扫描线求矩阵的面积并 参考连接: http://www.cnblogs.com/scau20110726/archive/2013/0 ...
- hdu 1828 线段树扫描线(周长)
Picture Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- hdu 1828 Picture(线段树扫描线矩形周长并)
线段树扫描线矩形周长并 #include <iostream> #include <cstdio> #include <algorithm> #include &l ...
- 51nod 1206 Picture 矩形周长求并 | 线段树 扫描线
51nod 1206 Picture 矩形周长求并 | 线段树 扫描线 #include <cstdio> #include <cmath> #include <cstr ...
- POJ 1177 Picture(线段树:扫描线求轮廓周长)
题目链接:http://poj.org/problem?id=1177 题目大意:若干个矩形,求这些矩形重叠形成的图形的轮廓周长. 解题思路:这里引用一下大牛的思路:kuangbin 总体思路: 1. ...
- luogu P1856 [USACO5.5]矩形周长Picture 扫描线 + 线段树
Code: #include<bits/stdc++.h> #define maxn 200007 #define inf 100005 using namespace std; void ...
随机推荐
- Android--LowMemoryKiller知识点补充
Android在内存管理上与linux有些小的区别.其中一个就是引入了Low memory killer . 1.引入原因: Android是一个多任务系统,也就是说可以同时运行多个程序,这个大家应该 ...
- 12天学好C语言——记录我的C语言学习之路(Day 8)
12天学好C语言--记录我的C语言学习之路 Day 8: 从今天开始,我们获得了C语言中很有力的一个工具,那就是函数.函数的魅力不仅于此,一个程序到最后都是由众多函数组成的,我们一定要用好函数,用熟练 ...
- 【Java咬文嚼字】关键字(一):super和this
这段时间一直在学Java,看了辣么多书以及博客,心痒也是着写写自己的学习心得. 这也算是新手篇:咬文嚼字Java中的关键字. 以关键字为第一篇博文也是考虑再三:1.本人基础也是薄弱 2.集跬步至千里 ...
- CAF(C++ actor framework)使用随笔(projection 用法)(一)
最近干活在写毕设,用到了CAF,看了文档,发现了一些小坑,自己摸索写点随笔.(CAF的github网站 https://github.com/actor-framework/actor-framewo ...
- 利用getComputedStyle方法获取元素css的属性值
在平时的工作中有时候会碰到需要获取元素当前样式的问题,查了一下可以用getComputedStyle这个方法来获取元素计算后的样式(有些我们在css里面没有写的,浏览器默认的样式也可以获得) getC ...
- Javascript常见全局函数
ØdecodeURI() 解码某个编码的 URI ØencodeURI() 把字符串编码为 URI ØdecodeURIComponent() 解码一个编码的 URI 组件 ØencodeURIC ...
- JavaScript的语法要点 2 - Scope Chain
前文所述,JavaScript是基于词法作用域(lexically scoped)的,所以标识符被固定在它们被定义的作用域而不是语法上或是其被调用时的作用域.即全局变量的作用域是整个程序,局部变量的作 ...
- Yii通过控制台命令创建定时任务
假设Yii项目路径为 /home/apps/ 1. 创建文件 /home/apps/protected/commands/crons.php <?php $yii = '/home/apps/f ...
- 【Ubuntu12.04】安装搜狗输入法
我的系统版本是Ubuntu12.04 32位 卸载Ibus输入法 sudo apt-get remove ibus 注意: 安装ibus的命令是 sudo apt-get install fcitx ...
- <二> SQL 基础
left (outer) join 结果集包含连接表的匹配行,也包括左连接表的所有行. select a.a, a.b, a.c, b.c b.d b.f from a left out join b ...