線段樹掃瞄線模板

2021-10-01 04:06:08 字數 4475 閱讀 4868

hdu 1542 

hdu 1255

hdu 3642

平面面積並

題目鏈結

超級棒的題解

#include

using

namespace std;

const

int n=

210;

int cnt[n<<2]

;double sum[n<<2]

,x[n]

;struct seg

seg(

double a,

double b,

double c,

int s):l

(a),

r(b),h

(c),

s(s)

bool

operator

<

(const seg &x)

const

//高度從下往上

}ss[n]

;voidup(

int rt,

int l,

int r)

void

update

(int l,

int r,

int c,

int l,

int r,

int rt)

int m=

(l+r)

>>1;

if(l<=m)

update

(l,r,c,l,m,rt<<1)

;if(mupdate

(l,r,c,m+

1,r,rt<<1|

1);up

(rt,l,r);}

intmain()

sort

(x,x+m)

;sort

(ss,ss+m)

;int k=unique (x,x+m)

-x;memset

(cnt,0,

sizeof

(cnt));

memset

(sum,0,

sizeof

(sum));

double ret=0;

for(

int i=

0;i1;i++

)printf

("test case #%d\n"

,cas++);

printf

("total explored area: %.2f\n\n"

,ret);}

}

平面面積的交集

link

%%

#include

using

namespace std;

const

int n=

2010

;double sum[n<<3]

,one[n<<3]

,x[n]

;int cnt[n<<3]

;//注意空間開大8倍

//題目要求被覆蓋兩次及以上的平面的面積 同之前的面積並比較我們需要收集的sum必須是該區間內覆蓋次數大於2 的線段長度

struct node

node

(double a,

double b,

double c,

int d):l

(a),

r(b),h

(c),

s(d)

bool

operator

<

(const node &x )

const

}seg[n]

;voidup(

int rt,

int l,

int r)

if(cnt[rt]==1

)if(cnt[rt]==0

)//區間目前的覆蓋次數是0

}void

update

(int rt,

int l,

int r,

int l,

int r,

int v)

int mid=

(l+r)

>>1;

if(l<=mid)

update

(rt<<

1,l,r,l,mid,v);if

(r>mid)

update

(rt<<1|

1,l,r,mid+

1,r,v);up

(rt,l,r);}

intmain()

sort

(x,x+m)

;sort

(seg,seg+m)

;memset

(sum,0,

sizeof

(sum));

memset

(cnt,0,

sizeof

(cnt));

memset

(one,0,

sizeof

(one));

int k=

unique

(x,x+m)

-x;double res=0;

for(

int i=

0;i1;i++

)printf

("%.2lf\n"

,res);}

}

掃瞄線演算法求三維空間重疊三次及以上部分的體積

link %%

#include

using

namespace std;

const

int n=

2010

;typedef

long

long ll;

int x[n]

,z[n]

;int xx,zz,n;

int cas=0;

int cnt[n<<3]

,one[n<<3]

,two[n<<3]

,sum[n<<3]

;//題目要求求空間中重疊超過三次的部分的體積

//idea:把x z 離散化求 面積(重疊超過三次的部分)乘以高度

//cnt表示某乙個區間內的覆蓋次數

//one表示這個區間被覆蓋了一次的線段的長度

//two 表示這個區間中被覆蓋兩次的線段的長度

//sum表示這個區間中被覆蓋三次的長度

struct node

node (

int l,

int r,

int h,

int s):l

(l),

r(r),h

(h),

s(s)

operator

<

(const node &x)

const

}seg[n]

;struct po};

struct cubea[n]

;voidup(

int rt,

int l,

int r)

//想法的其實和上面第二題很像

if(cnt[rt]==2

)if(cnt[rt]==1

)if(cnt[rt]==0

)}void

update

(int rt,

int l,

int r,

int l,

int r,

int v)

int mid=

(l+r)

>>1;

if(l<=mid)

update

(rt<<

1,l,mid,l,r,v);if

(r>mid)

update

(rt<<1|

1,mid+

1,r,l,r,v);up

(rt,l,r);}

void

deal()

}memset

(cnt,0,

sizeof

(cnt));

memset

(one,0,

sizeof

(one));

memset

(two,0,

sizeof

(two));

memset

(sum,0,

sizeof

(sum));

sort

(seg,seg+tot)

; ll s=0;

for(

int j=

0;j1;j++

) ans+

=s*(z[i+1]

-z[i]);

}printf

("case %d: %lld\n"

,++cas,ans);}

intmain()

if(n<3)

else

}}

線段樹 掃瞄線區間模板

線段樹 掃瞄線基礎模板 掃瞄線與普通的線段樹區別要認清,這裡線是連續的,其他的型別單點是離散的 include include include using namespace std int n const int maxn 10000 struct node void get int a,int ...

線段樹 掃瞄線 P5490 模板 掃瞄線

首先有這麼一張圖,要求它的面積並。我們想,如果可以有一條掃瞄線從下往上掃,記錄它所掃到的邊的長度 並 len 再求出這條邊與即將掃到的下一條邊的距離 h 那麼我們就可以求出第一塊面積 紫色 s 1 len times h 然而如何求出這個 len 顯然只用當前邊的長度是不行的,如 當掃到邊 r 2 ...

線段樹 掃瞄線

pku 1151 hdu1542 atlantis 矩形面積並 題意 給出n個矩形,每個矩形給出左下角座標,右上角座標。然後求矩形並的總面積 思路 浮點數先要離散化 然後把矩形分成兩條邊,上邊和下邊,對橫軸建樹,然後從下到上掃瞄上去,用cnt表示該區間下邊比上邊多幾個,sum代表該區間內被覆蓋的線段...