题目背景 墙上贴着许多形状相同的海报.照片.它们的边都是水平和垂直的.每个矩形图片可能部分或全部的覆盖了其他图片.所有矩形合并后的边长称为周长. 题目描述 编写一个程序计算周长. 如图1所示7个矩形. 如图2所示,所有矩形的边界.所有矩形顶点的坐标都是整数. 解析 首先想到模拟,这题数据小,直接暴力扫转折点,统计周长的增量就得了. 其实最优解就是这么做的. TAG里有扫描线,咱就用扫描线吧. 简单来说,还是扫描线同样的思路,做线段覆盖(具体实现可以百度,我懒得写了).入边权值为+1,出边权值为-…
Code: #include<bits/stdc++.h> #define maxn 200007 #define inf 100005 using namespace std; void setIO(string s) { string in=s+".in"; freopen(in.c_str(),"r",stdin); } struct Edge { int l,r,h,flag; }edges[maxn]; int n; namespace tr…
P1856 [USACO5.5]矩形周长Picture $len$            $sum$              $num$             $flag\_l$ $flage\_r$分别表示该区间 覆盖长度--整体覆盖次数--覆盖段数--左右端点是否覆盖 将上下边按高度排序不断扫下来 $num$是用来处理高度的 inline void Update(LL now,LL l,LL r){ if(tree[now].sum){ tree[now].num=1, tree[now…
题目背景 墙上贴着许多形状相同的海报.照片.它们的边都是水平和垂直的.每个矩形图片可能部分或全部的覆盖了其他图片.所有矩形合并后的边长称为周长. 题目描述 编写一个程序计算周长. 如图1所示7个矩形. 如图2所示,所有矩形的边界.所有矩形顶点的坐标都是整数. 输入输出格式 输入格式: 输入文件的第一行是一个整数N(0<=N<5000),表示有多少个矩形.接下来N行给出了每一个矩形左下角坐标和右上角坐标(所有坐标的数值范围都在-10000到10000之间). 输出格式: 输出文件只有一个正整数,…
线段树+扫描线 经典的扫描线问题 首先将一个矩形看作由竖着的两条边和横着的两条边构成 那分成两次考虑,一次考虑竖边,一次考虑横边 首先考虑横边 如图两个矩形,现将横边擦去,留下竖边,将平面划分成3个区域 在代码实现时,可以从左到右记录端点 那么现在想象一条平行于横边的扫描线不断从下往上扫 当扫到一个矩形的下边,将这条矩形的下边包含的区间覆盖 当扫到一个矩形的上边,将这条矩形的上边包含的区间去除覆盖 那么对于这些被竖线划分的区域,建立一棵线段树维护这些区间是否被覆盖 如最底下的矩形下边,覆盖区间2…
Loli 考试的题目之一 题目地址 \(N^2\)做法 #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> #defi…
看到一坨矩形就要想到扫描线.(poj atantis) 我们把横边竖边分开计算,因为横边竖边其实没有区别,以下论述全为考虑竖边的. 怎样统计一个竖边对答案的贡献呢?答:把这个竖边加入线段树,当前的总覆盖长度 减去 加入前的总覆盖长度 的绝对值 即为这个竖边的贡献. 这样做有一个要求,横坐标相同的竖边,要先加进去入边再删掉出边.(为什么呢?考虑两个矩形,一个矩形的右边和另一个矩形的左边的横坐标相同但上下错落) #include <algorithm> #include <iostream&…
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.对于纵向边,按横坐标排序,讨论方法与横向边相…
对于横轴,加上与上一次扫描的差值:对于竖轴,加上高度差与区间内不相交线段\(*2\)的积: 难点在pushdown,注意维护覆盖关系.再就注意负数 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #define R(a,b,c) for(register int a = (b); a <= (c);…
题目描述 墙上贴着许多形状相同的海报.照片.它们的边都是水平和垂直的.每个矩形图片可能部分或全部的覆盖了其他图片.所有矩形合并后的边长称为周长. 编写一个程序计算周长. 如图1所示7个矩形. 如图2所示,所有矩形的边界.所有矩形顶点的坐标都是整数. 输入输出格式 输入格式: 输入文件的第一行是一个整数\(N(0<=N<5000)\),表示有多少个矩形.接下来\(N\)行给出了每一个矩形左下角坐标和右上角坐标(所有坐标的数值范围都在\(-10000\)到\(10000\)之间). 输出格式: 输…