覆蓋的面積 HDU 1255 掃瞄線 二次覆蓋

2021-08-02 01:40:14 字數 933 閱讀 6154

#includeusing namespace std;

#define ll long long

const int maxn=1010;

int n;

double x[maxn<<1];

struct edge;

edge(double a,double b,double c,int d):l(a),r(b),h(c),v(d){};

bool operator<(const edge &b)const

void cal(int l,int r,int rt)else if(st[rt].l==st[rt].r)else

///if(st[rt].cnt>1)else if(l==r)else if(st[rt].cnt==1)else

}void update(int a,int b,int v,int l,int r,int rt)

int m=l+r>>1;

if(a<=m)update(a,b,v,l,m,rt<<1);

if(b>m)update(a,b,v,m+1,r,rt<<1|1);

cal(l,r,rt);

}int main()

sort(x+1,x+tt+1);

sort(edge+1,edge+tt+1);

int m=1;

for(int i=2;i<=tt;i++)

build(1,m,1);

double ans=0;

for(int i=1;i大部分**風格能和掃瞄線保持一致還蠻開心的。。

多次覆蓋的核心就在於cal函式

若當前區間被覆蓋過一次,當前區間被覆蓋2次的長度就加上子節點們覆蓋1次的長度

當時聽學長講的時候還感覺很迷,當時光聽,沒分清楚覆蓋次數和覆蓋長度。。orz

估計判ac的時候給了eps吧。。不然我樣例都沒過啊(

hdu 1255 覆蓋的面積 掃瞄線

一道挺簡單的題,讓我折騰了許久。主要卡在了更新節點後維護父親節點上。後來思路明確了就很容易了。節點資訊 l,r 區間端點 cnt 區間被覆蓋的次數,cnt 0說明沒有被完全覆蓋。len1 區間被覆蓋的長度 len2 區間至少被兩條線段覆蓋的長度。只要找到父親節點與子節點在len1,len2,cnt的...

覆蓋的面積 HDU 1255(掃瞄線求面積交)

題意 就是掃瞄線求面積交 解析 參考求面積並。就是把down的判斷條件改了一下。由w 0 改為 w 1 同時要討論一下 1 時 的情況,所以就要用到乙個臨時的sum。具體看 把 include include include include include include include inclu...

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

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