rr

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

一曲冷凌霜 提交于 2019-11-26 17:39:43
线段树+扫描线 经典的扫描线问题 首先将一个矩形看作由竖着的两条边和横着的两条边构成 那分成两次考虑,一次考虑竖边,一次考虑横边 首先考虑横边 如图两个矩形,现将横边擦去,留下竖边,将平面划分成3个区域 在代码实现时,可以从左到右记录端点 那么现在想象一条平行于横边的扫描线不断从下往上扫 当扫到一个矩形的下边,将这条矩形的下边包含的区间覆盖 当扫到一个矩形的上边,将这条矩形的上边包含的区间去除覆盖 那么对于这些被竖线划分的区域,建立一棵线段树维护这些区间是否被覆盖 如最底下的矩形下边,覆盖区间2,3 那么如何统计答案 答案就是上一次线段树维护的总区间被覆盖的长度-当前线段树维护的总区间覆盖的长度的绝对值 如上图,扫描到第2边,上一次覆盖2,3,那此处增加为1区间 那么线段树中维护这个区间被完全覆盖的次数和被覆盖的长度即可 #include <iostream> #include <algorithm> #include <map> #include <cstdio> #define inf (int)1e9 using namespace std; int n,w,last,ans; struct node { int a,b,c,d; }p[5100]; struct tree { int l,r,sum; int len; }sh[100000]; struct edge {