luogu1856
题目背景
墙上贴着许多形状相同的海报、照片。它们的边都是水平和垂直的。每个矩形图片可能部分或全部的覆盖了其他图片。所有矩形合并后的边长称为周长。
题目描述
编写一个程序计算周长。

如图1所示7个矩形。

如图2所示,所有矩形的边界。所有矩形顶点的坐标都是整数。
输入输出格式
输入格式:
输入文件的第一行是一个整数N(0<=N<5000),表示有多少个矩形。接下来N行给出了每一个矩形左下角坐标和右上角坐标(所有坐标的数值范围都在-10000到10000之间)。
输出格式:
输出文件只有一个正整数,表示所有矩形的周长。
输入输出样例
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
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的更多相关文章
- luogu1856 [USACO5.5]矩形周长Picture
看到一坨矩形就要想到扫描线.(poj atantis) 我们把横边竖边分开计算,因为横边竖边其实没有区别,以下论述全为考虑竖边的. 怎样统计一个竖边对答案的贡献呢?答:把这个竖边加入线段树,当前的总覆 ...
- Luogu1856 [USACO5.5]矩形周长Picture (线段树扫描线)
对于横轴,加上与上一次扫描的差值:对于竖轴,加上高度差与区间内不相交线段\(*2\)的积: 难点在pushdown,注意维护覆盖关系.再就注意负数 #include <iostream> ...
随机推荐
- javascript 深度克隆对象
js一般有两种不同数据类型的值: 基本类型(包括undefined,Null,boolean,String,Number),按值传递: 引用类型(包括数组,对象),按址传递,引用类型在值传递的时候是内 ...
- PAT A1028 List Sorting (25 分)——排序,字符串输出用printf
Excel can sort records according to any column. Now you are supposed to imitate this function. Input ...
- linux安装jenkins和编译发布gitlib项目
1. jenkins下载地址 wget https://updates.jenkins-ci.org/download/war/2.138/jenkins.war 2. 安装插件 安装gitlib和m ...
- docker 仓库搭建
阿里云服务器: 127.0.0.1(客户端) 127.0.0.2(私有服务器) 127.0.0.2作为私有仓库使用 1.下载镜像 [root@insure ~]# docker pull regist ...
- linux ntp 时间同步
一.时间同步服务器可以将数据库服务器作为同步服务器ntp.conf 保持不变 //启动服务service ntpd start //设置ntpd服务自启动chkconfig ntpd on//检查ch ...
- Asp.net中web.config配置文件详解(一)
本文摘自Asp.net中web.config配置文件详解 web.config是一个XML文件,用来储存Asp.NET Web应用程序的配置信息,包括数据库连接字符.身份安全验证等,可以出现在Asp. ...
- [C#]使用Windows Form开发的百度网盘搜索工具
BaiduDiskSearcher 用C#编写的百度网盘搜索工具(.NET4.0 & Visual Studio 2017) 功能 1.搜索任意名称的百度网盘共享文件 2.可以左键双击打开网盘 ...
- JDK8漫谈——增强接口
解决什么问题 向下兼容.添加方法,所有的实现类必须实现此方法,否则会编译报错.这意味着每一次的接口升级都会伤筋动骨.但是这是一把双刃剑一定要把握好场景,不要滥用. 类爆炸.使用时,需要辅助类.即要记忆 ...
- item 5: 比起显式的类型声明,更偏爱auto
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 啊,简单愉快的代码: int x; 等等,讨厌!我忘了初始化x,所 ...
- mysql 通过慢查询日志查写得慢的sql语句
MySQL通过慢查询日志定位那些执行效率较低的SQL 语句,用--log-slow-queries[=file_name]选项启动时,mysqld 会写一个包含所有执行时间超过long_query_t ...