https://www.luogu.org/problemnew/show/P1856

1.每个矩形由两条横向边和两条纵向边组成.

2.对于横向边,按纵坐标排序。设当前讨论的边为 A [s , t]

如果 A 是某个矩形的靠下的边,在树中查询[s,t]区间中被覆盖的长度为x,那么加上这条边后将增加(t-s-x);

如果 A 是某个矩形的靠上的边,先删除它的对应边,再在树中查询[s,t]区间中被覆盖的长度为x,那么加上这条边后将增加(t-s-x);

3、对于纵向边,按横坐标排序,讨论方法与横向边相同。

注意建树方式是以单位线段为叶子节点

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <cmath> #define LL long long using namespace std;
const int MAXN = 2e4 + ;
const int INF = 1e9; int n,m,Ans = ; #define Max 10001 inline void read(int &x){
x=; int f=; register char c = getchar();
while(c>''||c<''){ if(c=='-')f=-; c=getchar(); }
while(c>=''&&c<=''){ x=x*+c-''; c=getchar(); } x*=f;
} struct Seg_Ment{
int s,t,id,p; // s、t线段端点 p是排序依据 id--排序之前的编号
Seg_Ment(int a,int b,int c,int d):s(a),t(b),p(c),id(d){}
Seg_Ment(){ s=t=p=id=; }
bool operator < (const Seg_Ment a) const {
return p < a.p;
}
}x[MAXN],y[MAXN]; int lazy[MAXN << ],cnt[MAXN << ],l,r; inline void Push_Down(int u){
int ls = u << ,rs = u << |;
lazy[ls] += lazy[u],cnt[ls] += lazy[u],cnt[rs] += lazy[u],lazy[rs] += lazy[u];
lazy[u] = ;
} void UpDate(int u,int L,int R,int Del){
if(lazy[u]) Push_Down(u);
if(l <= L && R <= r){
cnt[u] += Del,lazy[u] += Del;
}
else if(L + < R){
int Mid = (L+R) >>,ls = u<<,rs = u<<|;
if(l <= Mid && L <= r) UpDate(ls,L,Mid,Del);
if(r >= Mid && l <= R) UpDate(rs,Mid,R,Del);
}
} int query(int u,int L,int R){
if(lazy[u]) Push_Down(u);
if(l <= L && R <= r && cnt[u] > ) return R - L;
if(L + < R){
int Mid = L+R >>,a = ,b = ;
if(l <= Mid) a = query(u<<,L,Mid);
if(r >= Mid) b = query(u<<|,Mid,R);
return a + b;
}
return ;
} int main(int argc,char *argv[]){
freopen("gg.out", "w", stdout);
cin >> n;
for(int i = ; i <= n; i ++) {
cout << i << ":" << " " << tan(i) << endl;
}
return ;
int x1,y1,xx,yy;
read(n);
for(int i=; i<=n; ++i){
read(x1),read(y1),read(xx),read(yy);
x1 += Max,xx += Max,y1 += Max, yy += Max;
x[i] = Seg_Ment(x1,xx,y1,i),y[i] = Seg_Ment(y1,yy,x1,i);
x[i + n] = Seg_Ment(x1,xx,yy,i + n),y[i + n] = Seg_Ment(y1,yy,xx,i + n);
} return ;
sort(x + ,x + * n + );
sort(y + ,y + * n + );
memset(lazy,,sizeof lazy ); memset(cnt,,sizeof cnt );
for(int i=; i<=n * ; ++i){
l = x[i].s, r = x[i].t;
if(x[i].id <= n){
Ans += abs(r - l - query(,,MAXN));
UpDate(,,MAXN,);
}
else {
UpDate(,,MAXN,-);
Ans += abs(r - l - query(,,MAXN));
}
}
memset(lazy,,sizeof lazy ); memset(cnt,,sizeof cnt );
for(int i=; i<=n * ; ++i){
l = y[i].s,r = y[i].t;
if(y[i].id <= n){
Ans += abs(r - l - query(,,MAXN));
UpDate(,,MAXN,);
}
else{
UpDate(,,MAXN,-);
Ans += abs(r - l - query(,,MAXN));
}
}
cout << Ans << endl;
return ;
}

[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. 洛谷P1856 [USACO5.5]矩形周长Picture

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

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

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

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

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

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

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

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

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

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

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

  9. 「USACO5.5」矩形周长Picture

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

随机推荐

  1. python2.7 编码问题

    python 2.7编码问题,着实令人头疼不已,这两天抽闲想真正弄明白.需要弄清楚这个问题,首先需要明白ASCII,Unicode 和 UTF-8之间的关系. 进行对上述几种概念进行描述之前,先进行简 ...

  2. SAS学习笔记17 SAS生成随机数函数(rand function)

  3. 去除空格函数trim

    实际查询中,经常存在多个tables,需要统一查询比如segments总大小或者索引或者主键等,我们得到大量的tables表名称,但是SQL查询,每次需要手工添加双引号,去除空格很麻烦. 可以通过文本 ...

  4. MH-P虚拟机DSR中安装SQL2008

    双击下载好的安装文件setup.exe.(注意:安装之前请确认是否有安装SQL Server 2008 R2需要的.NET Framework 3.5 SP1,我的环境由于之前有配置安装过,在这里不具 ...

  5. 常用shell命令积累

    把学习工作中见到的shell命令积累下来 创建文件夹 mkdir 创建文件 touch 发送get请求 curl xxxxx 发送post请求 curl -d xxxxx

  6. 栈 · 有getMin功能的栈O(1)

    题面 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中的最小元素的操作. 要求 pop(), push(), getMin()时间复杂度都是O(1) 思路 1.准备两个栈,数据栈+最小元素 ...

  7. 定义Java类实现字节流转字符流

    package com.buaa.comparable; import java.io.BufferedReader;import java.io.File;import java.io.FileIn ...

  8. redis集群安装2

      概要:本文主要介绍如何在Centos7中单机搭建redis集群三主三从,按照本文绝对可以实现该需求,至于先搭建单机版主要为了方便理解redis集群,为下一步开发或生产上redis集群做铺垫.同时本 ...

  9. bond模式详解

    目录 bond模式详解 一.什么是bond? 二.为什么使用bond? 三.bond模式配置 1.配置linux bond 2.将bond绑定到ovs上面(可选) 四.bond模式 1.模式0 2.模 ...

  10. #使用Python的turtle绘制正六边形、叠边形

    1.#Python的turtle绘制正六边形 代码: len=100 #表示边长像素 import turtle as t #正六边形内角都是120度,外角60度 for i in range(6): ...