(矩形求周長類似矩形合併求面積,只是多了需要統計豎邊的個數,對於每次求到的下底邊長還要增加目前底邊與下一條底邊之間的豎邊總長)
1,n個矩形有2*n條線段,按從小到大排列,如上圖得到的線段順序
開始掃瞄第一條線段,得到總底邊長sum為a這部分,得到豎邊個數segnum=2,(每增加一條底邊segnum+=2,每合併一條底邊segnum-=2,下底邊比上底邊相差為0則segnum=0)
於是得到一部分周長如圖藍色部分:
3:掃瞄第2條線段:
得到新的底邊sum=a+b,則新增加的底邊周長為sum-last,(last記錄的是上一次的底邊)
x表示該豎邊被合併了segnum-=2,(由於底邊合併了),所以segnum還是為2
則新增加周長為新增加的藍色部分:
後面同理繼續掃瞄
如果掃瞄到了上底邊,則底邊總長會相應的減少該上底邊的長度,則abs(sum-last)就是增加上底邊的長度
這裡說下掃瞄周長時不像掃瞄面積一樣只需掃瞄到第2n-1條線段就行
而是要掃瞄整個2n條線段,因為掃瞄底2n條線段時肯定是上底邊,得到的下底邊總長sum=0,但是abs(sum-last)就是增加這條上底邊的長度
#include#include#include#include#include#include#include#include#include#include#define inf 99999999
using namespace std;
const int max=20000+10;
int sum[max<<2];//統計下底邊總長度
int segnum[max<<2];//統計沒有被覆蓋的豎邊個數
bool lseg[max<<2],rseg[max<<2];//表示某個區間最左邊和最右邊是否有下底邊多於上底邊
int mark[max<<2];//表示下底邊比上底邊多的個數
struct seg
seg(int x1,int x2,int h,int c):l(x1),r(x2),h(h),d(c){}
bool operator
int main()
sort(s,s+k);
int ans=0,last=0;
for(int i=0;i
hdu 1828線段樹掃瞄線求周長並
include include include include include include include include include include include include include include include define iinf 2000000000 define ...
HDU 1828 掃瞄線求周長
思路 可以使用1條掃瞄線.從下往上我掃,在掃的過程中,周長就是下面的橫座標的投影加上上下兩條座標之差乘上縱座標線段數 需要注意重邊 include include include include include include include include include include defi...
HDU 1828 Picture 線段樹 掃瞄線
題意 給你一些矩形的左上角點的座標和右下角點的座標,求周長並 最顯而易見的思路就是對於x軸和y軸做兩次掃瞄線,對於負數的座標進行離散化。每次增加的值是線段變化量的絕對值。具體寫法和求面積並的差不多。include include include include using namespace std...