HDU 1828 Picture 線段樹 掃瞄線

2022-08-19 19:33:09 字數 2172 閱讀 5267

題意:給你一些矩形的左上角點的座標和右下角點的座標,求周長並

最顯而易見的思路就是對於x軸和y軸做兩次掃瞄線,對於負數的座標進行離散化。每次增加的值是線段變化量的絕對值。具體寫法和求面積並的差不多。

#include #include #include #include using namespace std;

#define lson rt << 1 , l , mid

#define rson rt << 1 | 1, mid + 1 , r

const int maxn = 10000 + 10;

int cnt[maxn << 2], len[maxn << 2], n;

struct seg

bool operator < (const seg &seg) const

};vectorseg;

vectornum;

int sx1[maxn], sy1[maxn], sx2[maxn], sy2[maxn];

void pushup(int rt, int l, int r)

void update(int rt, int l, int r, int ql, int qr, int val)

else

}int getid(int val)

int solve(int px1, int py1, int px2, int py2)

sort(seg.begin(), seg.end());

sort(num.begin(), num.end());

num.erase(unique(num.begin(), num.end()), num.end());

int ret = 0, msize = seg.size(), nowlen = 0, k = num.size();

for (int i = 0; i < msize; i++)

return ret;

}int main()

int ret = solve(sx1, sy1, sx2, sy2) + solve(sy1, sx1, sy2, sx2);

printf("%d\n", ret);

}}

總覺得可以就做一次掃瞄線就可以完成統計,就是不知道應該怎麼寫。看了別人的blog之後發現自己還是太弱。

要統計的東西有這些,假設掃瞄的是y軸。

1. y軸上有多少條線段,並且如果端點重合的話就算一條。因為x軸上面有多少條線是和y軸上有多少條線段有關的,是2倍的關係。為此還要開兩個陣列來輔助標記,表示當前線段的左端點和右端點是否被覆蓋。

2. y軸上點段的長度,這個和上面的做法統計的功能一樣。

3. 當前線段被覆蓋了多少次,這個也和上面的統計方法一樣。

#include #include #include #include #include using namespace std;

const int maxn = 2e4 + 10;

#define lson rt << 1, l, mid

#define rson rt << 1 | 1,mid + 1,r

struct seg

bool operator < (const seg &seg) const

};vectorseg;

int n;

bool lbound[maxn << 2], rbound[maxn << 2];

int numseg[maxn << 2], len[maxn << 2], cnt[maxn << 2];

int minval, maxval;

void pushup(int rt, int l, int r)

else if (l == r)

else }}

void update(int rt, int l, int r, int ql, int qr, int val)

else

}int main()

sort(seg.begin(), seg.end());

int msize = seg.size(), ret = 0, last = 0;

for (int i = 0; i < msize; i++)

printf("%d\n", ret);

} return 0;

}

Hdu1828 Picture 線段樹矩形周長並

題意 矩形周長並 輪廓線長度 思路 我們可以分開求,周長分為x軸上的和y軸上的 從下往上掃瞄,首先看x軸的邊,第一條邊我們可以直接加出貢獻,如果第二條邊我們和第一條有覆蓋部分,那麼我們要怎麼加呢,我們會發現要加的也就是 加入這條邊後的有效長度和沒加之前的有效長度的差值 只要加入一條邊使得整個有效長度...

hdu1828線段樹 掃瞄線

矩形求周長類似矩形合併求面積,只是多了需要統計豎邊的個數,對於每次求到的下底邊長還要增加目前底邊與下一條底邊之間的豎邊總長 1,n個矩形有2 n條線段,按從小到大排列,如上圖得到的線段順序 開始掃瞄第一條線段,得到總底邊長sum為a這部分,得到豎邊個數segnum 2,每增加一條底邊segnum 2...

HDU 1828 掃瞄線求周長

思路 可以使用1條掃瞄線.從下往上我掃,在掃的過程中,周長就是下面的橫座標的投影加上上下兩條座標之差乘上縱座標線段數 需要注意重邊 include include include include include include include include include include defi...