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. dotnet core 开发无缝兼容Http和Websocket协议的接口服务

    在应用接口开发中往往要针对不同协义开发相应的代理服务,但对于Websocket和http这两种协议来说就有些不同,从实现上来看Websocket可以说是Http的升级子协议, 两者在协议处理上基本一致 ...

  2. [MySQL]支持 emoji(字符集问题)

    问题的根源 主要问题就是在字符集,一般解决这种问题都是靠试验.我实验了一通,得出的结论和大家分享一下(如有错误,还望指正): 数据库的字符集 数据库连接的字符集 配置方法 设置数据库的字符集为utf8 ...

  3. ASP.NET Core 框架源码地址

    ASP.NET Core 框架源码地址 https://github.com/dotnet/corefx 这个是.net core的 开源项目地址 https://github.com/aspnet  ...

  4. 你真的会PHP吗?

    Note: 1) PHP中的数据类型 PHP一共支持八种数据类型, 4种标量类型,boolean(布尔型),integer(整形),float/double(浮点型)和string(字符串类型), 2 ...

  5. 补习系列(4)-springboot 参数校验详解

    目录 目标 一.PathVariable 校验 二.方法参数校验 三.表单对象校验 四.RequestBody 校验 五.自定义校验规则 六.异常拦截器 参考文档 目标 对于几种常见的入参方式,了解如 ...

  6. Java复制、移动和删除文件

    复制文件: Files.copy(fromPath,toPath); 例如: Files.copy(Paths.get("E:\\A.txt"), Paths.get(" ...

  7. 浅析java程序的执行过程

    在研究任何一门语言时,无论是面向过程的c,c++(面向过程和面向对象),还是面向对象的.net,java等,弄清语言执行过程至关重要.  何为语言执行过程? 所谓语言执行过程,指对于任何一门语言,如j ...

  8. [JavaScript] JavaScript事件注册,事件委托,冒泡,捕获,事件流

    面试题 event 事件 事件委托是什么? 如何阻止事件冒泡,阻止默认事件呢? Javascript 的事件流模型都有什么? 事件绑定和普通事件有什么区别? Event 对象 Event 对象,当事件 ...

  9. 如何优雅的使用 Python 实现文件递归遍历

    今天有个脚本需要遍历获取某指定文件夹下面的所有文件,我记得很早前也实现过文件遍历和目录遍历的功能,于是找来看一看,嘿,不看不知道,看了吓一跳,原来之前我竟然用了这么搓的实现. 先发出来看看: def ...

  10. Kotlin for循环使用

    普通for循环 for(i in 1..4){ println(i) } 结果为1234 循环四次 反序for循环 for(i in 4 downTo 1){ println(i) } 结果为4321 ...