線段樹(掃瞄線)(hdu1542 hdu1255)

2021-09-25 17:46:46 字數 2238 閱讀 5707

乙個連線,還不錯:

hdu1542:

題意:給你每個長方形的左下點的座標和右上點的座標,求他們的面積和。

hdu 1255:

題意:給你每個長方形的左下點的座標和右上點的座標,求出被這些矩形覆蓋過至少兩次的區域的面積

與上一題議題差別在第一題求總的面積,第二題求覆蓋兩次以上的面積。就len2表示下。

1.q[rt].s>1 : 說明該區間被覆蓋兩次或以上,那麼長度就可以直接計算,就是該區間的長度

剩下的情況就是q[rt].s=1或q[rt].s=0

2.先看葉子節點,因為是葉子沒有孩子了,所以被覆蓋兩次貨以上的長度就是0(無論q[rt].s=1或q[rt].s=0都是0,因為是葉子。。。)

3.不是葉子節點 ,且q[rt].s=1.注意這裡,q[rt].s=1確切的意義是什麼,應該是,可以確定,這個區間被完全覆蓋了1次,而有沒有被完全覆蓋兩次或以上則不知道無法確定,那麼怎麼怎麼辦了,只要加上q[ls].len1+q[rs].len1  即,看看左右孩子區間被覆蓋了一次或以上的長度,那麼疊加在雙親上就是雙親被覆蓋兩次或以上的長度

3.不是葉子節點,且q[rt].s=0,確切的意義應該是不完全不知道被覆蓋的情況(不知道有沒有被覆蓋,被覆蓋了幾次,長度是多少都不知道),這種情況,只能由其左右孩子的資訊所得

q[ls].len2+q[rs].len2  , 即直接將左右孩子給覆蓋了兩次或以上的長度加起來,這樣才能做到不重不漏

#include #include #include #include #include #include #include #include #include #include #define ull unsigned long long

#define ls rt<<1

#define rs rt<<1|1

#define mems(a,b) memset(a,b,sizeof(a))

using namespace std;

typedef long long ll;

const ll mod=1000000007;

const int n=2210;

const double pi=acos(-1);

const int inf=0x3f3f3f3f;

const int m=50000+5;

struct edge

edge(double l,double r,double h,int f):l(l),r(r),h(h),f(f) {}

bool operator <(const edge &a) const

return -1;

}void build(int l,int r,int rt)

void pushup(int rt)

else if(q[rt].l==q[rt].r)//這是乙個點

else

// if(q[rt].s>1)//該區間被覆蓋兩次以上

// q[rt].len2=x[q[rt].r+1]-x[q[rt].l];

// else if(q[rt].l==q[rt].r)

// q[rt].len2=0;

// else if(q[rt].s==1)

// q[rt].len2=q[ls].len1+q[rs].len1;

// else

// q[rt].len2=q[ls].len2+q[rs].len2;

}void update(int l,int r,int c,int rt)

int mid=(q[rt].l+q[rt].r)>>1;

if(r<=mid)

update(l,r,c,ls);

else if(l>mid)

update(l,r,c,rs);

else

pushup(rt);

}int main()

sort(e,e+tot);

//離散化座標

sort(x,x+tot);

int k=unique(x,x+tot)-x;//去重

build(0,k-1,1);

double ans=0.0;

for(int i=0;iprintf("test case #%d\n",p++);

printf("total explored area: %.2f\n\n",ans);

}return 0;

}

hdu1542(線段樹 掃瞄線)

裸的掃瞄線,學習掃瞄線的題目。具體掃瞄線的原理我不講了,我是看大神們的部落格懂得,就算寫也沒大神屌。下面我給出我的 裡面的注釋是我認為比較重要的地方 include include include includeusing namespace std const int max 210 int n ...

hdu 1542 掃瞄線 線段樹

題目大意 求矩形面積的並 思路 按y軸排序,然後將x投影到線段樹上做乙個線段覆蓋問題即可 注意 為了避免重複,線段座標右端點是開區間,更新時需要加上1 include include include include include define fo i,a,b for int i a i b i ...

hdu1542(線段樹 掃瞄線)

題目連線 又看到了幾個月前做的題,感覺那時候就是個sb 也怪自己剛開始沒搞清楚線段樹,瞎摸索 用連續線段樹很好理解這個題,之前的 稍微改了一下就好理解多了 1 include2 include3 include4 define lson l,m,rt 1 5 define rson m,r,rt 1...