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

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

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

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

 #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. 一、简介 ELO商户类别推荐有助于了解客户忠诚度

    Elo Merchant Category Recommendation Help understand customer loyalty (ELO商户类别推荐有助于了解客户忠诚度) 竞赛描述: 想象 ...

  2. [1] first day

    一.几个工具包 [1]pandas(数据分析工具) https://zhuanlan.zhihu.com/p/33230331 https://zhuanlan.zhihu.com/p/2501351 ...

  3. freeswich 安装mod_av

    转载   https://www.cnblogs.com/zgen1/p/7867303.html 需要先编译libav库 编译libav下载:git clone https://freeswitch ...

  4. “王者对战”之 MySQL 8 vs PostgreSQL 10

    既然 MySQL 8 和 PostgreSQL 10 已经发布了,现在是时候回顾一下这两大开源关系型数据库是如何彼此竞争的. 在这些版本之前,人们普遍认为,Postgres 在功能集表现更出色,也因其 ...

  5. 经常使用的MySQL语句整理

    本文參考:http://www.blogjava.net/bolo 部分自己补充,长期更新 MySQL的SQL语句写法,除了那些主要的之外,另一些也算比較经常使用的,这里记录下来,以便以后查找. 好记 ...

  6. 写一个函数,输入int型,返回整数逆序后的字符串

    刚刚看到一个面试题:写一个函数,输入int型,返回整数逆序后的字符串.如:输入123,返回"321". 要求必须用递归,不能用全局变量,输入必须是一个參数.必须返回字符串.&quo ...

  7. poj 2528 Mayor&#39;s posters 【线段树 + 离散化】

    Mayor's posters Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 50643   Accepted: 14675 ...

  8. LCA 近期公共祖先 小结

    LCA 近期公共祖先 小结 以poj 1330为例.对LCA的3种经常使用的算法进行介绍,分别为 1. 离线tarjan 2. 基于倍增法的LCA 3. 基于RMQ的LCA 1. 离线tarjan / ...

  9. Linux下安装intellij idea

    1.下载 http://www.jetbrains.com/idea/download/#section=linux 我下载的是不带jdk的版本 2.放入opt目录中 3.解压到usr下面的intel ...

  10. Oracle动态性能表-V$SESSION_WAIT,V$SESSION_EVENT

    (1)-V$SESSION_WAIT 这是一个寻找性能瓶颈的关键视图.它提供了任何情况下session在数据库中当前正在等待什么(如果session当前什么也没在做,则显示它最后的等待事件).当系统存 ...