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代表該區間內被覆蓋的線段...