hdu 1255 覆蓋的面積 線段樹

2021-06-22 07:13:11 字數 1786 閱讀 3022

記錄3個變數。

sum[i]:當前區間被覆蓋2次及兩次以上的面積。

num[i]:當前區間被覆蓋1次及一次以上的面積。

cover[i]:覆蓋的lazy標記。

對於每乙個區間.

更新操作如下:

void push_up(int_now)

if(cover[rt]==1)

if(cover[rt]>=2)

}

那麼剩下的問題就是簡單的區間更新問題了。

還有,要注意每乙個點所代表的含義。

我的每個點代表的含義為當前點到下乙個點的長度。

#include#include#include#include#include#include#include#include#pragma comment(linker, "/stack:1024000000,1024000000")

using namespace std;

#define maxn 11000

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

#define lmin 1

#define rmax len

#define lson l,(l+r)/2,rt<<1

#define rson (l+r)/2+1,r,rt<<1|1

#define root lmin,rmax,1

#define now l,r,rt

#define int_now int l,int r,int rt

#define inf 99999999

#define ll long long

#define mod 10007

#define eps 1e-6

#define zero(x) (fabs(x)mp;

double du[4010];

int len;

struct list

node[maxn];

struct linen

}line[maxn*2];

double sum[maxn*4*4*2];

double num[maxn*4*4*2];

int cover[maxn*4*4*2];

void push_up(int_now)

if(cover[rt]==1)

if(cover[rt]>=2)

}void push_down(int_now)

void creat(int_now)

void updata(int ll,int rr,int x,int_now)

updata(ll,rr,x,lson);

updata(ll,rr,x,rson);

push_up(now);

}int main()

sort(line+1,line+n*2+1);

sort(du+1,du+s+1);

du[0]=-1;

len =0;

mp.clear();

for(int i=1;i<=s;i++)

}creat(root);

double st=0;

double are=0.0;

len--;

for(int i=1;i<=n*2;i++)

updata(l,r-1,line[i].leap,root);

}printf("%.2lf\n",are);

}return 0;

}

hdu 1255 覆蓋的面積(線段樹求面積交)

給定平面上若干矩形,求出被這些矩形覆蓋過至少兩次的區域的面積.雖說覆蓋兩次區域的面積,但是這道題實際上就是求矩形的面積交。膜拜能夠想出這種解法的神牛,竟然能把實際的東西用這麼抽象的語言表示出來,實在是佩服,現在關於掃瞄線的題才做了幾道,沒有對其深刻理解,但是多練總可以理解的,奮鬥吧!acmer!我是...

HDU 1255 覆蓋的面積(線段樹求矩形面積交)

題意 給出n個矩形,求出至少被兩塊矩形覆蓋的面積。思路 跟面積並類似的做法,不同的是每個節點要額外維護乙個至少被覆蓋兩次的長度dcnt,此外還是要維護至少覆蓋一次的長度cnt,然後每次由當前結點的cover標記和子節點的dcnt,cnt值來推出當前結點的dcnt,cnt值。include inclu...

HDU 1255 覆蓋的面積 線段樹 掃瞄線

還是先離散化座標,然後用線段樹掃瞄線 其中sum代表被覆蓋過一次的長度,sum2代表被覆蓋過2次及以上的長度。然後注意pushup操作比較麻煩。id sdj22251 prog subset lang c include include include include include include...