hdu 3642 覆蓋3次以上體積

2022-09-17 23:48:15 字數 2253 閱讀 2172

題目大意:給你n個立方體,求相交區域大於等於三次的體積和。

這題需要前面兩題的知識

體積並面積交:

對於面積交,另外建立len2陣列表示覆蓋2次的面積,len3陣列表示覆蓋3次及以上的面積

對於體積並,離散化x座標是為了建樹,離散化z座標是為了節省時間。對於所有的體積範圍進行面積交之和即為所求體積

#include #include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define mem(a,b) memset(a,b,sizeof(a))

#define pf printf

#define sf scanf

#define spf sprintf

#define pb push_back

#define debug printf("!\n")

#define maxn 2000+5

#define max(a,b) a>b?a:b

#define blank pf("\n")

#define ll long long

#define all(x) x.begin(),x.end()

#define ins(x) inserter(x,x.begin())

#define pqueue priority_queue

#define inf 0x3f3f3f3f

#define ls (rt<<1)

#define rs (rt<<1|1)

intn,m;

int hh[maxn],hh2[maxn],col[maxn<<3],len[maxn<<3],len2[maxn<<3],len3[maxn<<3

];struct

node

node(

int a,int b,int c,int d,int e,int

f):l(a),r(b),x(c),c(d),z1(e),z2(f){}

bool

operator

< (const node &b) const

}a[maxn

<<3],tmp[maxn<<3

];void pushup(int rt,int l,int

r)

else

if(col[rt] == 2

)

else

if(col[rt] == 1

)

}else

if(l==r) len[rt] = len2[rt] = len3[rt] = 0

;

else

}void update(int val,int l,int r,int l,int r,int

rt)

int mid = (l+r)>>1

;

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

if(r > mid) update(val,l,r,mid+1

,r,rs);

pushup(rt,l,r);

}int

main()

sort(hh+1,hh+1+v);

sort(hh2+1,hh2+1+v);

sort(a+1,a+1+v);

int d=1,d2=1

;

for(i=2;i<=v;i++)

if(hh[i]!=hh[i-1

]) hh[++d]=hh[i];

for(i=2;i<=v;i++)

if(hh2[i]!=hh2[i-1

]) hh2[++d2]=hh2[i];

int ct =0

;

for(j=1;j<=d2-1;j++)

}pf(

"case %d: %i64d\n

",kase++,ans);

}return0;

}

HDU 3642 掃瞄線求覆蓋3次的體積 線段樹

hdu 3642 至少有2個以上不同地點才存在寶藏.即3個以上的空間立體交叉覆蓋出的體積,覆蓋3次及以上 x y z包括整個庫,意思就是給出頂點,觀察樣例知道是左上和右下的座標z 500.那麼掃瞄法求出平面的面積,在處理題目給出的每一層.求的體積 x用來離散化後作為橫軸建線段樹,z軸存下來列舉每乙個...

HDU3642 三維空間下的求體積並

這道題要求我們求得是在三維空間下 給定的n個長方體重疊三次以上的體積。而我們只需要先把z座標軸拿掉,求三次以上的體積,就是在二維平面上找到重疊三次的面積再乘以這段面積上 存在的z的長度即可得到這段體積.因此就把三維空間的問題轉化到二維空間處理 重點就是三次覆蓋情況下pushup函式的寫法 sum1代...

HDU1255 求覆蓋兩次及以上的矩形面積 掃瞄線

兩次的覆蓋不僅僅單獨的改變cnt的判斷條件 而是要進行討論,儘管現在只有1層標記或者沒有標記 仍然可能對當前做出貢獻 也就是 分情況討論 1.cnt 1 說明該區間被覆蓋兩次或以上,那麼長度就可以直接計算,就是該區間的長度,剩下的情況就是cnt 1或cnt 0 2.先看葉子節點,因為是葉子沒有孩子了...