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. mysql 数据表 增删改查

    用户操作: mysql -u root -p 登录root用户: SHOW DATABASES; 显示所有的数据库名称: USE linuxcast; 切入linuxcast数据库: CREATE T ...

  2. eclipse中文字体大小修改

    貌似有不少人苦恼eclipse中文字体大小修改问题,默认的eclipse中文字体很小,和英文字体大小完全不在一个调子上,因为默认的eclipse juno中英文字体是Consolas,字体大小是10, ...

  3. SPOJ GSS(Can you answer the Queries)系列 7/8

    GSS1 线段树最大子段和裸题,不带修改,注意pushup. 然而并不会猫树之类的东西 #include<bits/stdc++.h> #define MAXN 50001 using n ...

  4. Luogu1081 NOIP2012 开车旅行 倍增

    题目传送门 为什么NOIP的题目都这么长qwq 话说2012的D1T3和D2T3都是大火题啊qwq 预处理神题 对于这种跳跳跳的题目考虑使用倍增优化枚举.先预处理某个点之后距离最小和次小的城市,然后倍 ...

  5. CF28D Don't fear, DravDe is kind 背包

    题目传送门:http://codeforces.com/problemset/problem/28/D 题意:给你$N$个物品,每个物品有其价格$P_i$,之前必须要买的物品价格和$L_i$,之后必须 ...

  6. React-理解Redux

    Redux是什么? 是专于状态管理的库 专于状态管理和react解耦 单一状态,单项数据流 核心概念 store state action reducer Redux工作流 react 要改变stor ...

  7. Session配置之WebApi支持

    1.在WebApiConfig中建立建立HttpControllerHandler和HttpControllerRouteHandler 并覆写它 public class SessionRouteH ...

  8. open-falcon ---安装Dashboard时候报错"SSLError: The read operation timed out"

    在部署open-falcon环境过程中,安装Dashboard时候报错"SSLError: The read operation timed out".如下: [root@open ...

  9. Linux下路由配置梳理

    在日常运维作业中,经常会碰到路由表的操作.下面就linux运维中的路由操作做一梳理:---------------------------------------------------------- ...

  10. Week3 关于“微软必应词典客户端”的案例分析

    第一部分  调研,评测 一.iphone客户端的bug挖掘: 1.在例句中点击单词或短语,如果这个时候点得稍微快了一点,关联相应的翻译时会出现混乱. 经过调查发现,这个bug应该是必应得一个全平台错误 ...