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. javascript 深度克隆对象

    js一般有两种不同数据类型的值: 基本类型(包括undefined,Null,boolean,String,Number),按值传递: 引用类型(包括数组,对象),按址传递,引用类型在值传递的时候是内 ...

  2. PAT A1028 List Sorting (25 分)——排序,字符串输出用printf

    Excel can sort records according to any column. Now you are supposed to imitate this function. Input ...

  3. linux安装jenkins和编译发布gitlib项目

    1. jenkins下载地址 wget https://updates.jenkins-ci.org/download/war/2.138/jenkins.war 2. 安装插件 安装gitlib和m ...

  4. docker 仓库搭建

    阿里云服务器: 127.0.0.1(客户端) 127.0.0.2(私有服务器) 127.0.0.2作为私有仓库使用 1.下载镜像 [root@insure ~]# docker pull regist ...

  5. linux ntp 时间同步

    一.时间同步服务器可以将数据库服务器作为同步服务器ntp.conf 保持不变 //启动服务service ntpd start //设置ntpd服务自启动chkconfig ntpd on//检查ch ...

  6. Asp.net中web.config配置文件详解(一)

    本文摘自Asp.net中web.config配置文件详解 web.config是一个XML文件,用来储存Asp.NET Web应用程序的配置信息,包括数据库连接字符.身份安全验证等,可以出现在Asp. ...

  7. [C#]使用Windows Form开发的百度网盘搜索工具

    BaiduDiskSearcher 用C#编写的百度网盘搜索工具(.NET4.0 & Visual Studio 2017) 功能 1.搜索任意名称的百度网盘共享文件 2.可以左键双击打开网盘 ...

  8. JDK8漫谈——增强接口

    解决什么问题 向下兼容.添加方法,所有的实现类必须实现此方法,否则会编译报错.这意味着每一次的接口升级都会伤筋动骨.但是这是一把双刃剑一定要把握好场景,不要滥用. 类爆炸.使用时,需要辅助类.即要记忆 ...

  9. item 5: 比起显式的类型声明,更偏爱auto

    本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 啊,简单愉快的代码: int x; 等等,讨厌!我忘了初始化x,所 ...

  10. mysql 通过慢查询日志查写得慢的sql语句

    MySQL通过慢查询日志定位那些执行效率较低的SQL 语句,用--log-slow-queries[=file_name]选项启动时,mysqld 会写一个包含所有执行时间超过long_query_t ...