Loli 考试的题目之一

#include <cstdio>
#include <cstring>
#define re register
#define GC getchar()
#define Clean(X,K) memset(X,K,sizeof(X))
#include <iostream>
#define LS (RT*2)
#define RS (RT*2+1)
#include <algorithm>
#define Abs(X) ((X)<0?-(X):(X))
using namespace std ;
int Qread () {
int X = 0 , F = 1;
char C = GC ;
while (C > '9' || C < '0') {
if (C == '-') F = -1;
C = GC ;
}
while (C >='0' && C <='9') {
X = X * 10 + C - '0' ;
C = GC ;
}
return X * F ;
}
const int MaxL = 100001 << 1 , Dlt = 100001;
struct Node {
int Left , Right , Date , Tag ;
};
Node T[MaxL << 2] ;
int N ;
void Plant (int RT ,int L , int R) {
T[RT].Date = R - L + 1 , T[RT].Tag = -1 ;
T[RT].Left = L , T[RT].Right = R ;
if (L == R) return ;
int Mid = (L + R) >> 1 ;
Plant (LS , L , Mid) , Plant (RS , Mid + 1 , R) ;
}
void Spd (int RT) {
if (T[RT].Tag == 1) {
T[LS].Date = T[LS].Right - T[LS].Left + 1 , T[RS].Date = T[RS].Right - T[RS].Left + 1 ;
T[LS].Tag = T[RS].Tag = 1 ;
}
if (T[RT].Tag == 0) {
T[LS].Date = T[RS].Date = 0 ;
T[LS].Tag = T[RS].Tag = 0 ;
}
T[RT].Tag = -1 ;
}
int Ask (int RT ,int L , int R) {
if (L <= T[RT].Left && T[RT].Right <= R) return T[RT].Date ;
Spd(RT) ;
int Al = 0 , Ar = 0 , Mid = (T[RT].Left + T[RT].Right ) >> 1 ;
if (L <= Mid) Al = Ask (LS , L , R) ;
if (R > Mid) Ar = Ask (RS , L, R);
return Al + Ar ;
}
void Add (int RT , int L , int R , int K) {
if (L <= T[RT].Left && T[RT].Right <= R) {
T[RT].Date = (K ? T[RT].Right - T[RT].Left + 1 : 0) ;
T[RT].Tag = K ;
return ;
}
int Mid = (T[RT].Left + T[RT].Right ) >> 1 ;
Spd(RT) ;
if (L <= Mid) Add (LS , L , R , K) ;
if (R > Mid) Add (RS , L , R , K) ;
T[RT].Date = T[LS].Date + T[RS].Date ;
}
struct Segment {
int Place , From , Goto , Tag;
};
Segment X[MaxL] , Y[MaxL] ;
bool C (const Segment &X , const Segment &Y) {
return X.Place < Y.Place ;
}
int A[MaxL] ;
int main () {
// freopen ("P1856.in" , "r" , stdin) ;
N = Qread () ;
Plant (1 , 1 , N << 1);
for (re int i = 1 ; i <= N; ++ i) {
int A = Qread() + Dlt, B = Qread () + Dlt, C = Qread() + Dlt,D = Qread () + Dlt;
X[i].From = X[i + N].From = Y[i].Place = A ;
X[i].Goto = X[i + N].Goto = Y[i + N].Place = C ;
Y[i].From = Y[i + N].From = X[i].Place = B ;
Y[i].Goto = Y[i + N].Goto = X[i + N].Place = D ;
X[i].Tag = Y[i].Tag = 1 , X[i + N].Tag = Y[i + N].Tag = -1 ;
-- X[i].Goto , -- X[i + N].Goto , -- Y[i].Goto , -- Y[i + N].Goto ;
} std :: sort (X + 1 , X + 1 + (N << 1) , C) ;
std :: sort (Y + 1 , Y + 1 + (N << 1) , C) ;
long long int Ans = 0 ;
Clean (A , 0) ;
for (re int i = 1 ; i <= 2 * N ; ++ i) {
if (X[i].Tag == 1) {
for (re int j = X[i].From ; j <= X[i].Goto ; ++ j) {
if (A[j] == 0) ++ Ans ;
++ A[j] ;
}
} else {
for (re int j = X[i].From ; j <= X[i].Goto ; ++ j) {
-- A[j] ;
if (A[j] == 0) ++ Ans ;
}
}
}
swap (X , Y) ;
Clean(A , 0) ;
for (re int i = 1 ; i <= 2 * N ; ++ i) {
if (X[i].Tag == 1) {
for (re int j = X[i].From ; j <= X[i].Goto ; ++ j) {
if (A[j] == 0) ++ Ans ;
++ A[j] ;
}
} else {
for (re int j = X[i].From ; j <= X[i].Goto ; ++ j) {
-- A[j] ;
if (A[j] == 0) ++ Ans ;
}
}
}
cout << Ans <<endl;
fclose (stdin) ,fclose (stdout) ;
return 0 ;
}

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

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

随机推荐

  1. [Python Web]部署完网站需要做的基本后续工作

    简述 今天自己上线了一个简单的 Page,没有什么功能就是一个展示页. 但是,我发现部署完,上线后,还要弄不少东西.下面就是我记录.整理的一些上线网站基本都会用到的网站和配置. 加入统计代码 这个是必 ...

  2. 【Java基础】【09面向对象_多态&抽象类&接口】

    09.01_面向对象(多态的概述及其代码体现) A:多态(polymorphic)概述 事物存在的多种形态 B:多态前提 a:要有继承关系. b:要有方法重写. c:要有父类引用指向子类对象. C:案 ...

  3. linux权限之su和sudo的差别

    我们都知道非常多的文件都仅仅有root有权限来改动,那么在我们平时的开发过程中都建议使用一般账号来登录进行开发.还记得前面说到的ssh吗.我们也是将同意root登录设置成no.到必要的时候再切换到ro ...

  4. 简单的SQL注入之2

    Topic Link http://ctf5.shiyanbar.com/web/index_2.php 一.方法One sqlmap直接跑出来 1)暴库 2)爆表 3)爆段 4) 结果 二.方法Tw ...

  5. ASP.NET Core教程【二】从保存数据看Razor Page的特有属性与服务端验证

    前文索引:ASP.NET Core教程[一]关于Razor Page的知识 在layout.cshtml文件中,我们可以看到如下代码: <a asp-page="/Index" ...

  6. Spring基础系列--AOP实践

    原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9615720.html 本文目的是简单讲解下Spring AOP的使用. 推荐使用IDEA ...

  7. Jenkins结合.net平台综合之完整示例项目

    前面每一个部分我们都是介绍的单个功能,这里介绍一个完整项目,本文中所用到的命令都放在了github示例代码仓库中 https://github.com/mrtylerzhou/netdevops 命令 ...

  8. Perl IO:IO重定向

    文件句柄和文件描述符的关系 文件描述符是操作系统的资源,对于实体文件来说,每打开一次文件,操作系统都会为该进程分配一个文件描述符来关联(指向)这个文件,以后操作文件数据都根据这个文件描述符来操作,而不 ...

  9. 【.NET Core项目实战-统一认证平台】第八章 授权篇-IdentityServer4源码分析

    [.NET Core项目实战-统一认证平台]开篇及目录索引 上篇文章我介绍了如何在网关上实现客户端自定义限流功能,基本完成了关于网关的一些自定义扩展需求,后面几篇将介绍基于IdentityServer ...

  10. 第7章 贡献 - Identity Server 4 中文文档(v1.0.0)

    我们对社区贡献非常开放,但您应该遵循一些指导原则,以便我们可以毫不费力地处理这个问题. 7.1 如何贡献? 最简单的方法是打开一个问题并开始讨论.然后我们可以决定是否以及如何实现功能或更改.如果您应提 ...