覆蓋的面積 HDU 1255 面積的交

2021-09-13 11:50:29 字數 1348 閱讀 3809

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

剩下的情況就是cnt=1或cnt=0

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

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

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

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

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

#define lson l,mid,rt<<1

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

const int maxn=22222;

double sum[maxn<<2];

int lazy[maxn<<2];

double sum2[maxn<<2];

struct line

bool operator <(const struct line& b)const

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

int mid=(l+r)>>1;

if(l<=mid) update(l,r,c,lson);

if(r>mid) update(l,r,c,rson);

pushup(l,r,rt);

}int main()

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

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

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

memset(sum,0,sizeof(sum));

memset(lazy,0,sizeof(lazy));

memset(sum2,0,sizeof(sum2));

double ans=0;

for(int i=0;iprintf("%.2lf\n",ans);

}return 0;

}

hdu 1255 覆蓋的面積

與poj1151略有不同 由於是大於等於2 的有效 所以應該更新到點 include include include include include include include include include includeusing namespace std define inf 0x3f3...

HDU 1255 覆蓋的面積

題目鏈結點這裡 這道題,很久以前做過,當時寫了個暴力,居然過了,然後一直想寫下線段樹的,結果一直被各種事搞得忘了。現在終於填坑了。include include include includeusing namespace std define mem x,y memset x,y,sizeof x...

HDU 1255 覆蓋的面積

題目 給定平面上若干矩形,求出被這些矩形覆蓋過至少兩次的區域的面積.input 輸入資料的第一行是乙個正整數t 1 t 100 代表測試資料的數量.每個測試資料的第一行是乙個正整數n 1 n 1000 代表矩形的數量,然後是n行資料,每一行包含四個浮點數,代表平面上的乙個矩形的左上角座標和右下角座標...