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

2021-09-25 23:13:19 字數 1292 閱讀 9812

hdu 1255

add>1說明覆蓋>=2次可以直接計算覆蓋長度q[i].len2 = x[q[i].r + 1] - x[q[i].l];如果是葉節點就q[i].len2=0add=1說明當前節點區間被覆蓋了一次,想要求得覆蓋>=2次的區間,(此時還要考慮子區間被覆蓋的情況)加上子區間被覆蓋>=1次的區間長度,累加起來就被覆蓋>=2add=0,為了維護當前節點的len2值,從下到上更新q[i].len2 = q[ls].len2 + q[rs].len2;

#include #include #include using namespace std;

const int n = 1005;

struct edge

}e[n<<1];

struct node q[n<<3]; //n個矩形 n<<1個點

double x[n<<1];

#define ls i<<1

#define rs i<<1|1

void pushup(int i)

void build(int i,int l,int r)

void update(int i,int l,int r,int val)

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

if (r <= mid) update(ls,l,r,val);

else if (l > mid) update(rs,l,r,val);

else

pushup(i);

}int main()

sort(e,e+tot); //給所有橫邊按高度排序

int k = 1;

for (int i = 1; i < tot; i++) //去重,如果相同就跳過,將後面的複製給前面的

if (x[i] != x[i - 1]) x[k++] = x[i];

build(1,0,k-1); // k-1是``的右端點

double ans = 0;

for (int i = 0; i < tot; i++)

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

} return 0;

}

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

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...

hdu 1255 覆蓋的面積 掃瞄線

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

HDU 1255 覆蓋的面積 掃瞄線求區間交

思路 在寫這題以前,強烈推薦先寫完hdu1542 然後這題相對於上面一題的區別就在於這題要求的是求覆蓋兩次的面積,上一題只要覆蓋1次的面積.所以總的來說,區別主要是在與push up這個函式上 void push up int rt,int l,int r 注意 好像這個並不用build的 推薦大佬...