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. 如何用浏览器在线查看.ipynb文件

            当我们用jupyter notebook编辑好.ipynb文件后,肯定会想不用运行jupyter notebook也能方便得查看.ipynb的文件,如果直接打开.ipynb的文件,我们 ...

  2. [十五]java.math包简介,RoundingMode与MathContext

    java.math包提供了java中的数学类 包括基本的浮点库.复杂运算以及任意精度的数据运算   '可以看得到,主要包括三个类一个枚举 BigDecimal和BigInteger接下来会详细介绍 先 ...

  3. Lily_music 网页音乐播放器 -可搜索(附歌词联动播放效果解说)

    博客地址:https://ainyi.com/59 写在前面 这是我今年(2018)年初的小项目,当时也是手贱,不想用别的播放器,想着做一个自己的网页播放器,有个歌曲列表.可关键词搜索.歌词滚动播放的 ...

  4. QSS的使用(二)——实现ColorLabel

    在上一篇文章中,我们已经了解了QSS的基础使用,现在我们将会看到一个简单的例子来加深对QSS的理解. 需求分析 我们想要在界面中让文本显示出指定的颜色,现在有几种方案: 使用paintEvent手动计 ...

  5. [PHP] 抽象类abstract的回顾

    1.abstract定义为抽象的类不能被实例化. 2.它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的. 3.被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实 ...

  6. php 使用Glob() 查找文件技巧

    定义和用法 glob() 函数返回匹配指定模式的文件名或目录. 该函数返回一个包含有匹配文件 / 目录的数组.如果出错返回 false. 参数 描述 file 必需.规定检索模式. size 可选.规 ...

  7. Java开发笔记(三十三)字符包装类型

    正如整型int有对应的包装整型Integer那样,字符型char也有对应的包装字符型Character.初始化字符包装变量也有三种方式,分别是:直接用等号赋值.调用包装类型的valueOf方法.使用关 ...

  8. java开发环境配置——Maven

    前篇讲了jdk的安装,这篇讲一下包管理工具Maven,Maven主要是用来统一管理项目引用的jar包,还有用来打包的. Maven官网下载地址:http://maven.apache.org/down ...

  9. JavaScript 是如何工作:Shadow DOM 的内部结构 + 如何编写独立的组件!

    这是专门探索 JavaScript 及其所构建的组件的系列文章的第 17 篇. 如果你错过了前面的章节,可以在这里找到它们: JavaScript 是如何工作的:引擎,运行时和调用堆栈的概述! Jav ...

  10. 驰骋工作流引擎JFlow与activiti的对比之4种高级分支同步模式

    多重选择(Multiple Choice) 在流程中,当一个活动完成后,有多个分支进行选择,可以选择执行其中的一个或者N个分支. 例子:比如去世博园玩,在门口检票后,可以选择A-E个片区中的N个进行观 ...