P1856 [USACO5.5]矩形周长Picture

题目背景

墙上贴着许多形状相同的海报、照片。它们的边都是水平和垂直的。每个矩形图片可能部分或全部的覆盖了其他图片。所有矩形合并后的边长称为周长。

题目描述

编写一个程序计算周长。

如图1所示7个矩形。

如图2所示,所有矩形的边界。所有矩形顶点的坐标都是整数。

输入输出格式

输入格式:

输入文件的第一行是一个整数N(0<=N<5000),表示有多少个矩形。接下来N行给出了每一个矩形左下角坐标和右上角坐标(所有坐标的数值范围都在-10000到10000之间)。

输出格式:

输出文件只有一个正整数,表示所有矩形的周长。

输入输出样例

输入样例#1:

7
-15 0 5 10
-5 8 20 25
15 -4 24 14
0 -6 16 4
2 15 10 22
30 10 36 20
34 0 40 16
输出样例#1:

228

求周长和,不用离散的方法

记录最小值和最小值出现的个数

#include <cstdio>
#include <algorithm>
using namespace std;
#define N 10005
int n,x1[N],y1[N],x2[N],y2[N];
struct node{int x1,x2,y,op;}line[N];
inline bool cmp(node a,node b){return a.y!=b.y?a.y<b.y:a.op>b.op;}
struct SegmentTree{int l,r,mi,sum,lazy;}Tree[N<<];
inline void pushup(int x)
{
if(Tree[x<<].mi==Tree[x<<|].mi)Tree[x].sum=Tree[x<<].sum+Tree[x<<|].sum, Tree[x].mi=Tree[x<<].mi;
else if(Tree[x<<].mi<Tree[x<<|].mi)Tree[x].sum=Tree[x<<].sum, Tree[x].mi=Tree[x<<].mi;
else Tree[x].sum=Tree[x<<|].sum, Tree[x].mi=Tree[x<<|].mi;
}
inline void ADD(int x,int v){Tree[x].lazy+=v;Tree[x].mi+=v;}
inline void pushdown(int x){ADD(x<<,Tree[x].lazy); ADD(x<<|,Tree[x].lazy); Tree[x].lazy=;}
inline void build(int l,int r,int x)
{
Tree[x].l=l; Tree[x].r=r; Tree[x].lazy=;
if(l==r){Tree[x].sum=;Tree[x].mi=;return;}
int mid=(l+r)>>;build(l,mid,x<<);build(mid+,r,x<<|);pushup(x);
}
inline void updata(int l,int r,int x,int v)
{
if(l==Tree[x].l&&Tree[x].r==r){Tree[x].lazy+=v;Tree[x].mi+=v;return;}
if(Tree[x].lazy!=) pushdown(x); int mid=(Tree[x].l+Tree[x].r)>>;
if(r<=mid)updata(l,r,x<<,v); else if(l>mid) updata(l,r,x<<|,v);
else updata(l,mid,x<<,v), updata(mid+,r,x<<|,v); pushup(x);
}
int main()
{
int i,ans=; scanf("%d",&n);
for(i=;i<=n;i++)
{
scanf("%d%d%d%d",&x1[i],&y1[i],&x2[i],&y2[i]);
line[i*-].x1=line[i*].x1=x1[i]; line[i*-].x2=line[i*].x2=x2[i]-;
line[i*-].y=y1[i]; line[i*].y=y2[i]; line[i*-].op=; line[i*].op=-;
}n*=;
sort(line+,line+n+,cmp); build(-N,N,);
for(i=;i<=n;i++)
{
int oo=Tree[].sum*(Tree[].mi==); updata(line[i].x1,line[i].x2,,line[i].op); ans+=abs(oo-Tree[].sum*(Tree[].mi==));
}
for(i=;i<=n;i++)
{
line[i*-].x1=line[i*].x1=y1[i]; line[i*-].x2=line[i*].x2=y2[i]-;
line[i*-].y=x1[i]; line[i*].y=x2[i]; line[i*-].op=; line[i*].op=-;
}
sort(line+,line+n+,cmp); build(-N,N,);
for(i=;i<=n;i++)
{
int oo=Tree[].sum*(Tree[].mi==); updata(line[i].x1,line[i].x2,,line[i].op); ans+=abs(oo-Tree[].sum*(Tree[].mi==));
}
printf("%d\n",ans);
}

luogu1856的更多相关文章

  1. luogu1856 [USACO5.5]矩形周长Picture

    看到一坨矩形就要想到扫描线.(poj atantis) 我们把横边竖边分开计算,因为横边竖边其实没有区别,以下论述全为考虑竖边的. 怎样统计一个竖边对答案的贡献呢?答:把这个竖边加入线段树,当前的总覆 ...

  2. Luogu1856 [USACO5.5]矩形周长Picture (线段树扫描线)

    对于横轴,加上与上一次扫描的差值:对于竖轴,加上高度差与区间内不相交线段\(*2\)的积: 难点在pushdown,注意维护覆盖关系.再就注意负数 #include <iostream> ...

随机推荐

  1. struts2中ajax的使用

    前面写过原生js实现ajax的博客,但是用起来不是太方便,jquery对原生的js进行了很好的封装,使用起来也更简单:但是在项目中使用了struts2,处理ajax却又不同,花了几天时间研究,终于解决 ...

  2. async源码学习 - 控制流程waterfall函数

    waterfall函数会连续执行数组中的函数,每次通过数组下一个函数的结果.然而,数组任务中的任意一个函数结果传递失败,那么该函数的下一个函数将不会执行,并且主回调函数立马把错误作为参数执行. 以上是 ...

  3. char.IsLetter的使用

    先看一下下面的代码,大家会觉得控制台输出什么? 输出:Chiantxt  .对吗? 因为你看到char.IsLetter这个方法的文字的注释是这样写的: 但实际上输出的结果是这样的: ??? 怎么还输 ...

  4. 使用jquery-combobox实现select下拉框多选之后,如何将下拉框的值传给input隐藏域

    我在之前的一篇博文中eaeyui-combobox实现组合查询(即实现多个值得搜索)地址:http://www.cnblogs.com/dushan/p/4778897.html 实现了select下 ...

  5. 方差(variance)、标准差(Standard Deviation)、均方差、均方根值(RMS)、均方误差(MSE)、均方根误差(RMSE)

    方差(variance).标准差(Standard Deviation).均方差.均方根值(RMS).均方误差(MSE).均方根误差(RMSE) 2017年10月08日 11:18:54 cqfdcw ...

  6. Hive 数据的导入导出

    数据的导入: 通过文件导入,使用load命令 一.导入本地文件: load data local inpath '/home/hadoop/files/emp.txt' overwrite into ...

  7. zookeepeer集群搭建

    一.预备工作 1.zookeepeer需要安装JDK,至于版本,大家可以去官网查询一下.这里我安装的是JDK8. 2.需要开放zookeepeer用到的端口,默认端口2181.2888.3888,至于 ...

  8. [Oracle][Corruption]发生ORA00600[kdsgrp1]的时候,如何进行调查

    本质上,这很可能是坏块引发的,所以需要调查 关联的Table 中的坏块状况: Excerpt of trace file============================*** 2017-08- ...

  9. 2016年总结 - Java程序员

    一 . 技术积累 (1)代码规范 1.1.1.通常的模块分布:一般如果你要实现一个web应用,你从后台将数据展示到前端页面,在一个比较大的公司,你少不了跟其他项目有交集(你调用他的接口,他依赖你的接口 ...

  10. item 7:当创建对象的时候,区分()和{}的使用

    本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 从不同的角度来看,在C++11中,对象初始化拥有多种语法选择,这体 ...