题目背景

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

题目描述

编写一个程序计算周长。

如图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

扫描线线段树

其实能够找到的一些题解的线段树都暴力的很,如果稍微数据强一点就能卡,但是这题数据实在是太弱了QAQ

 #include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<vector>
#define MAXN 5005
#define MAXM 10005
#define X first
#define Y second
#define pii pair<int,int>
using namespace std;
int read(){
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if('-'==ch)f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
struct Node{
int L,R,p,b;
Node(int p1=,int p2=,int p3=,int p4=){
L=p1,R=p2,p=p3,b=p4;
}
};
bool comp(const Node &p1,const Node &p2){
if(p1.p!=p2.p){
return (p1.p<p2.p);
}
else{
return (p1.b>p2.b);
}
}
int n;
vector<Node> vx,vy;
void init(){
n=read();
for(int i=;i<=n;i++){
int x1=read(),y1=read(),x2=read(),y2=read();
x1+=,y1+=,x2+=,y2+=;
vx.push_back(Node(x1,x2,y1,));vx.push_back(Node(x1,x2,y2,-));
vy.push_back(Node(y1,y2,x1,));vy.push_back(Node(y1,y2,x2,-));
}
sort(vx.begin(),vx.end(),comp);sort(vy.begin(),vy.end(),comp);
n=*;
}
int dat[MAXM<<],tag[MAXM<<];
void pushdown(int k){
int lc=(k<<),rc=(k<<|);
dat[lc]+=tag[k],dat[rc]+=tag[k];
tag[lc]+=tag[k],tag[rc]+=tag[k];
tag[k]=;
}
void pushup(int k){
dat[k]=min(dat[k<<],dat[k<<|]);
}
void add(int a,int b,int k,int L,int R,int x){
if(b<=L||R<=a){
return;
}
else if(a<=L&&R<=b){
dat[k]+=x;
tag[k]+=x;
}
else{
if(tag[k]){
pushdown(k);
}
add(a,b,k<<,L,(L+R)>>,x);
add(a,b,k<<|,(L+R)>>,R,x);
pushup(k);
}
}
int query(int a,int b,int k,int L,int R){
if(b<=L||R<=a){
return ;
}
if(L+==R){
return (dat[k]?:);
}
else if(a<=L&&R<=b&&dat[k]){
return R-L;
}
else{
if(tag[k]){
pushdown(k);
}
int lc=query(a,b,k<<,L,(L+R)>>);
int rc=query(a,b,k<<|,(L+R)>>,R);
return (lc+rc);
}
}
int Abs(int x){
return (x>?x:-x);
}
void solve(){
int ans=;
for(int i=;i<vx.size();i++){
int x=vx[i].L,y=vx[i].R,b=vx[i].b;
int cnt1=query(x,y,,,n+);
add(x,y,,,n+,b);
int cnt2=query(x,y,,,n+);
ans+=Abs(cnt1-cnt2);
// printf("%d ",Abs(cnt1-cnt2));
}
// printf("\n");
for(int i=;i<vy.size();i++){
int x=vy[i].L,y=vy[i].R,b=vy[i].b;
int cnt1=query(x,y,,,n+);
add(x,y,,,n+,b);
int cnt2=query(x,y,,,n+);
ans+=Abs(cnt1-cnt2);
// printf("%d ",Abs(cnt1-cnt2));
}
printf("%d\n",ans);
}
int main()
{
// freopen("data.in","r",stdin);
// freopen("my.out","w",stdout);
init();
solve();
return ;
}

洛谷P1856 [USACO5.5]矩形周长Picture的更多相关文章

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

    P1856 [USACO5.5]矩形周长Picture $len$            $sum$              $num$             $flag\_l$ $flage\_ ...

  2. P1856 [USACO5.5]矩形周长Picture[扫描线]

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

  3. luogu P1856 [USACO5.5]矩形周长Picture 扫描线 + 线段树

    Code: #include<bits/stdc++.h> #define maxn 200007 #define inf 100005 using namespace std; void ...

  4. [题解]P1856 [USACO5.5]矩形周长Picture

    Loli 考试的题目之一 题目地址 \(N^2\)做法 #include <cstdio> #include <cstring> #define re register #de ...

  5. Luogu P1856 [USACO5.5]矩形周长Picture

    线段树+扫描线 经典的扫描线问题 首先将一个矩形看作由竖着的两条边和横着的两条边构成 那分成两次考虑,一次考虑竖边,一次考虑横边 首先考虑横边 如图两个矩形,现将横边擦去,留下竖边,将平面划分成3个区 ...

  6. [USACO5.5] 矩形周长Picture

    https://www.luogu.org/problemnew/show/P1856 1.每个矩形由两条横向边和两条纵向边组成. 2.对于横向边,按纵坐标排序.设当前讨论的边为 A [s , t] ...

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

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

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

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

  9. 洛谷P1345 [USACO5.4]奶牛的电信Telecowmunication【最小割】分析+题解代码

    洛谷P1345 [USACO5.4]奶牛的电信Telecowmunication[最小割]分析+题解代码 题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流. ...

随机推荐

  1. 201621123025《Java程序设计》第1周学习总结

    201621123025<Jave程序设计>第一周学习总结 1.本章学习总结 对于java这门课程,如果不会编码那么会很难学会如何去使用它,而在大一的一二学期的专业课--C语言和数据结构我 ...

  2. new malloc和delete free 的区别

    今天看了一个面试题:问new 和 malloc, delete 和 free 的区别,扭捏了半天,也没说完全:现总结如下: 1.先看看new 和 delete 看一个例子: <span styl ...

  3. Flask 视图

    写个验证用户登录的装饰器:在调用函数前,先检查session里有没有用户 from functools import wraps from flask import session, abort de ...

  4. Linux 目录与文件管理

    1. 目录与路径1.1 相对路径与绝对路径1.2 目录的相关操作: cd, pwd, mkdir, rmdir1.3 关于执行文件路径的变量: $PATH2. 档案与目录管理2.1 档案与目录的检视: ...

  5. apache的重写规则

    RewriteEngine OnRewriteCond %{REQUEST_FILENAME} .*\.(jpg|jpeg|gif|png) [NC]RewriteRule .* http://i8. ...

  6. Hadoop安装-部署-测试

    一:准备Linux环境[安装略]        a.修改主机名                vim /etc/sysconfig/network                NETWORKING= ...

  7. 关于团购VPS的事情报告

    作者 玄魂   2017-08-11 玄魂工作室-玄魂 玄魂工作室首先要抱歉,之前的说的继续组织大家购买vps的事情,不会再组织了.原因有以下几个:1)因为人多,需求各不相同,不好协调.2)服务都是购 ...

  8. CTF中常见密码题解密网站总结

    0x00.综合 网站中包含大多编码的解码. http://web2hack.org/xssee/ https://www.sojson.com/ http://web.chacuo.net/ 0x01 ...

  9. Error loading MySQLdb module: No module named 'MySQLdb'----------- django成功连接mysql数据库的方法

    在进行django学习过程中,尝试使用框架连接mysql数据库,启动服务器的时候经常遇到Error loading MySQLdb module: No module named 'MySQLdb' ...

  10. 为什么Java不能以返回值区分重载方法?

    读者可能会想:"在区分重载方法的时候,为什么只能以类名和方法的形参列表作为标准呢?能否考虑用方法的返回值来区分呢?" 比如下面两个方法,虽然他们有相同的名字和形式参数,但却很容易区 ...