依然是扫描线,只不过是求所有矩形覆盖之后形成的图形的周长。

容易发现,扫描线中的某一条横边对答案的贡献。

其实就是 加上/去掉这条边之前的答案 和 加上/去掉这条边之后的答案 之差的绝对值

然后横着竖着都做一遍就行了

 #include <cstdio>
#include <cstring>
#include <algorithm>
#define N 10010
#define ll long long
using namespace std; int n,sz;
int a[N],cnt[N<<],sum[N<<];
struct SQU{
int a1,b1,a2,b2;
}q[N];
struct node{
int l,r,la,ra,h,f;
}sc[N];
int cmp1(node s1,node s2){
if(s1.h!=s2.h) return s1.h<s2.h;
else return s1.f>s2.f;
}
void pushup(int l,int r,int rt)
{
if(cnt[rt]>) sum[rt]=a[r+]-a[l];
else if(l==r) sum[rt]=;
else sum[rt]=sum[rt<<]+sum[rt<<|];
}
void update(int L,int R,int l,int r,int rt,int w)
{
if(L<=l&&r<=R)
{
cnt[rt]+=w;
pushup(l,r,rt);
return;
}
int mid=(l+r)>>;
if(L<=mid) update(L,R,l,mid,rt<<,w);
if(R>mid) update(L,R,mid+,r,rt<<|,w);
pushup(l,r,rt);
}
void clr()
{
memset(a,,sizeof(a));
memset(sc,,sizeof(sc));
memset(cnt,,sizeof(cnt));
memset(sum,,sizeof(sum));
}
int solvex()
{
int ans=,lst=;
for(int i=;i<=n;i++)
{
a[*i-]=q[i].a1,a[*i]=q[i].a2;
sc[*i-].l=q[i].a1,sc[*i].l=q[i].a1;
sc[*i-].r=q[i].a2,sc[*i].r=q[i].a2;
sc[*i-].h=q[i].b1,sc[*i].h=q[i].b2;
sc[*i-].f=,sc[*i].f=-;
}
sort(a+,a+*n+);
sz=unique(a+,a+*n+)-(a+);
sort(sc+,sc+*n+,cmp1);
for(int i=;i<=*n;i++)
{
int la=lower_bound(a+,a+sz+,sc[i].l)-a;
int ra=lower_bound(a+,a+sz+,sc[i].r)-a;
lst=sum[];
update(la,ra-,,sz,,sc[i].f);
ans+=abs(sum[]-lst);
}
return ans;
}
int solvey()
{
int ans=,lst=;
for(int i=;i<=n;i++)
{
a[*i-]=q[i].b1,a[*i]=q[i].b2;
sc[*i-].l=q[i].b1,sc[*i].l=q[i].b1;
sc[*i-].r=q[i].b2,sc[*i].r=q[i].b2;
sc[*i-].h=q[i].a1,sc[*i].h=q[i].a2;
sc[*i-].f=,sc[*i].f=-;
}
sort(a+,a+*n+);
sz=unique(a+,a+*n+)-(a+);
sort(sc+,sc+*n+,cmp1);
for(int i=;i<=*n;i++)
{
int la=lower_bound(a+,a+sz+,sc[i].l)-a;
int ra=lower_bound(a+,a+sz+,sc[i].r)-a;
lst=sum[];
update(la,ra-,,sz,,sc[i].f);
ans+=abs(sum[]-lst);
}
return ans;
} int main()
{
//freopen("data.in","r",stdin);
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d%d%d%d",&q[i].a1,&q[i].b1,&q[i].a2,&q[i].b2);
int ret=;
ret+=solvex();
clr();
ret+=solvey();
printf("%d\n",ret);
return ;
}

HDU 1828 Picture (线段树:扫描线周长)的更多相关文章

  1. HDU 1828 Picture (线段树+扫描线)(周长并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1828 给你n个矩形,让你求出总的周长. 类似面积并,面积并是扫描一次,周长并是扫描了两次,x轴一次,y ...

  2. POJ 1177/HDU 1828 picture 线段树+离散化+扫描线 轮廓周长计算

    求n个图矩形放下来,有的重合有些重合一部分有些没重合,求最后总的不规则图型的轮廓长度. 我的做法是对x进行一遍扫描线,再对y做一遍同样的扫描线,相加即可.因为最后的轮廓必定是由不重合的线段长度组成的, ...

  3. hdu 1828 Picture(线段树 || 普通hash标记)

    http://acm.hdu.edu.cn/showproblem.php?pid=1828 Picture Time Limit: 6000/2000 MS (Java/Others)    Mem ...

  4. hdu 1828 Picture(线段树轮廓线)

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

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

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

  6. hdu1828 Picture(线段树+扫描线+矩形周长)

    看这篇博客前可以看一下扫描线求面积:线段树扫描线(一.Atlantis HDU - 1542(覆盖面积) 二.覆盖的面积 HDU - 1255(重叠两次的面积))  解法一·:两次扫描线 如图我们可以 ...

  7. HDU 1828 Picture(长方形的周长和)

    HDU 1828 Picture 题目链接 题意:给定n个矩形,输出矩形周长并 思路:利用线段树去维护,分别从4个方向扫一次,每次多一段的时候,就查询该段未被覆盖的区间长度,然后周长就加上这个长度,4 ...

  8. HDU 1542 - Atlantis - [线段树+扫描线]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1542 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...

  9. 覆盖的面积 HDU - 1255 (线段树-扫描线)模板提

    给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. Input输入数据的第一行是一个正整数T(1<=T<=100),代表测试数据的数量.每个测试数据的第一行是一个正整数N(1& ...

随机推荐

  1. IOS - 绘制文字 drawInRect: withFont: not working

    在图形绘制中,我们经常会需要绘制文本,但我在给PDF上绘制Text时,始终绘制不上, 使用过: [str drawInRect:cubeRect withAttributes:attrs]; CGCo ...

  2. WEBGL学习【十一】光照模型

    <!DOCTYPE HTML> <html lang="en"> <head> <title>Listing 7-3 and 7-4 ...

  3. [HEOI2013]Eden 的新背包问题

    数据极水,不加优化的多重背包都能过...早知道考试的时候不加奇奇怪怪的卡常优化,卡了45分... 就是从前往后做一个多重背包,从后往前再做一个,问的时候就暴力求一下跳过这个的最佳方案... #incl ...

  4. 深入了解Spring

    1.Bean后处理器 Spring容器提供了一个接口InitializingBean,实现这个接口的bean只要重写afterPropertiesSet()或者在XML中添加init-method属性 ...

  5. sso 系统分析

    一.什么是 sso 系统 SSO 英文全称 Single Sign On,单点登录.SSO 是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.它包括可以将这次主要的登录映射到其他 ...

  6. hdu 1385 floyd记录路径

    可以用floyd 直接记录相应路径 太棒了! http://blog.csdn.net/ice_crazy/article/details/7785111 #include"stdio.h& ...

  7. 【转】sql 基本语法

    简单语法:http://www.cnblogs.com/lyhabc/p/3691555.html 数据类型宽度:http://www.cnblogs.com/lyhabc/p/3696629.htm ...

  8. SVN文件恢复

    SVN删除文件 一.本地删除 SVN删除文件里的本地删除,指的是在clientdelete了一个文件,但还没有commit.使用revert来撤销删除. 二.server删除 1.通过本地删除后提交s ...

  9. 英语发音规则---V字母

    英语发音规则---V字母 一.总结 一句话总结: 1.V发[v]? voice [vɒɪs] n. 声音 love [lʌv] n. 恋爱 leave [liːv] vt. 离开 very ['ver ...

  10. WebBrowser网页操作之提取获取元素和标签(完整篇)

    最近使用WebBrower做了几个Hook小程序,收集积累如下: using System; using System.Collections.Generic; using System.Linq; ...