扫描线 求多个矩形合并后的周长 hdu1828 Picture

题目链接   hdu1828 Picture 

题目大意:给你多个矩形,求他们合并后的周长,被覆盖的边不能算进周长之内。

解题思路: 其实周长并和面积并没什么很大的区别,只不过周长并增加了判断左右端点是否被覆盖的标记 lbd 和rbd 数组, 以及numseg 数组 记录连续区间段数。

numseg : 一根扫描线扫描过去,会记录有多少个连续的区间段,每个连续的区间段都有两条相等的竖边,而每次扫描过去竖边长度都相等。

#include 
 #include 
 #include 
 #include 
 using namespace std;
 
 #define lz 2*u,l,mid
 #define rz 2*u+1,mid+1,r
 const int maxn=22222;
 int sum[4*maxn];              ///记录被覆盖区间的长度
 int lbd[4*maxn], rbd[4*maxn]; ///记录左右端点是否被覆盖
 int numseg[4*maxn];            ///记录该区间连续的段数
 int flag[4*maxn];              /// 记录该区间是否被覆盖
 
 struct Node
 {
     int lx, rx, y, s;
     int lbd, rbd;
     Node() {};
     Node(int lx_, int rx_, int y_, int s_)
     {
         lx=lx_, rx=rx_, y=y_, s=s_;
     }
     bool operator <(const Node &S) const
     {
         if(y==S.y) return s>S.s;
         return y>1;
     if(tr<=mid) Update(lz,tl,tr,c);
     else if(tl>mid) Update(rz,tl,tr,c);
     else
     {
         Update(lz,tl,mid,c);
         Update(rz,mid+1,tr,c);
     }
     push_up(u,l,r);
 }
 
 int main()
 {
     int n;
     while(cin >> n)
     {
         int x1, x2, y1, y2;
         int num=0, lbd=10000, rbd=-10000;
         for(int i=0; i


你可能感兴趣的:(线段树)