思路:可以使用1條掃瞄線.從下往上我掃,在掃的過程中,周長就是下面的橫座標的投影加上上下兩條座標之差乘上縱座標線段數(需要注意重邊)
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define eps 1e-8
#define inf 0x3f3f3f3f
#define mod 1e9+7
#define pi acos(-1)
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
using
namespace
std;
typedef
long
long ll;
typedef
unsigned
long
long ull;
const
int maxn = 5e4 + 5;
//點的座標位於[-10000,10000],因此不需要離散化
//當計算乙個圖形的面積的時候,在更新最後一條上邊的時候,sum[1]=0,所以最後相減還能取到上邊的長度
int n, lbd[maxn << 2], rbd[maxn << 2], sum[maxn << 2], vtl[maxn << 2];
int col[maxn << 2];
//col 標記覆蓋,lbd標記區間最左側是否被覆蓋,rbd標記右側是否被完全覆蓋
//vtl標記在區間範圍內有幾豎線,sum標記區間範圍內橫座標長度
int cnt;
//cnt 邊的數量
struct node
node() {}
node(int a, int b, int c, int d): l(a), r(b), h(c), flag(d) {}
} ss[maxn << 2];
void push_up(int rt, int l, int r) else
if(l == r) else
}void updata(int l, int r, int flag, int l, int r, int rt)
int mid = (l + r) >> 1;
if(mid >= l) updata(l, r, flag, lson);
if(mid < r) updata(l, r, flag, rson);
push_up(rt, l, r);
}int main() ;
ss[cnt++] = ;
max = max(max, x2);//選擇x座標的而最大最小值,確定線段樹區間的上下界
min = min(min, x1);
}sort(ss, ss + cnt);
ss[cnt]=ss[cnt-1];//防止下面+1導致出現錯誤,在評測中發現好像並沒有什麼影響
int last=0;//last記錄在上一條邊的時候的線段集合在x座標的投影,用於比較記錄結果
int ans=0;
for(int i = 0; i < cnt; i++)
printf("%d\n",ans);
}return
0;}
hdu 1828線段樹掃瞄線求周長並
include include include include include include include include include include include include include include include define iinf 2000000000 define ...
hdu1828線段樹 掃瞄線
矩形求周長類似矩形合併求面積,只是多了需要統計豎邊的個數,對於每次求到的下底邊長還要增加目前底邊與下一條底邊之間的豎邊總長 1,n個矩形有2 n條線段,按從小到大排列,如上圖得到的線段順序 開始掃瞄第一條線段,得到總底邊長sum為a這部分,得到豎邊個數segnum 2,每增加一條底邊segnum 2...
HDU1828矩形周長合併(線段樹 離散)
和面積合併類似,只不過要多記錄有多少個不連續的線段。如總長為4,可能是1 2,3 4兩段,也可能是1 4一段,計算面積是一樣但計算周長就不一樣了。以下程式來自網上,收藏備參考。include include include using namespace std const int n 5e3 5 ...