HDU 1828 掃瞄線求周長

2021-08-21 19:28:35 字數 1744 閱讀 4029

思路:可以使用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 ...