題意:
就是掃瞄線求面積交
解析:參考求面積並。。。。 就是把down的判斷條件改了一下。。由w > 0 改為 w > 1 同時要討論一下 == 1 時 的情況, 所以就要用到乙個臨時的sum。。
具體看**把
#include #include#include
#include
#include
#include
#include
#include
#include
#include
#include
#define mod 2018
#define ll long long
#define ull unsigned long long
#define pair pair#define mem(a, b) memset(a, b, sizeof(a))
#define _ ios_base::sync_wity_stdio(0),cin.tie(0)
//freopen("1.txt", "r", stdin);
using
namespace
std;
const
int maxn = 2010, inf = 0x7fffffff
;double x[maxn]; //
記錄x的座標
struct
nodenode[maxn*3
];struct
edgeedge[maxn];
intcmp(edge a, edge b)
void build(int k, int ll, int rr) //
建樹void down(int k) //
計算長度
else
if(node[k].w == 1
)
else
}}void update(int k, edge e) //
更新
if(e.rxx <= node[k*2].rx) update(k*2
, e);
else
if(e.lxx >= node[k*2+1].lx) update(k*2+1
, e);
else
down(k);
}int
main()
sort(edge+1, edge+cnt+1
, cmp);
sort(x+1, x+cnt+1
);
int m = unique(x+1, x+cnt+1) - (x+1
); build(
1, 1
, m);
double ret = 0
;
for(int i=1; i)
printf(
"%.2f\n
",ret);
}return0;
}
hdu 1255 覆蓋的面積 掃瞄線
一道挺簡單的題,讓我折騰了許久。主要卡在了更新節點後維護父親節點上。後來思路明確了就很容易了。節點資訊 l,r 區間端點 cnt 區間被覆蓋的次數,cnt 0說明沒有被完全覆蓋。len1 區間被覆蓋的長度 len2 區間至少被兩條線段覆蓋的長度。只要找到父親節點與子節點在len1,len2,cnt的...
HDU 1255 覆蓋的面積 線段樹 掃瞄線
還是先離散化座標,然後用線段樹掃瞄線 其中sum代表被覆蓋過一次的長度,sum2代表被覆蓋過2次及以上的長度。然後注意pushup操作比較麻煩。id sdj22251 prog subset lang c include include include include include include...
hdu 1255 覆蓋的面積 線段樹 掃瞄線
一直想搞線段樹的掃瞄線,這道題算是入門了吧。這題需要用到 離散化,因為座標是浮點數。還有就是線段樹中的掃瞄線的知識,另外,這題需要求重複的面積和,所以在運用線段樹的時候需要更新到葉子節點。每乙個葉子節點儲存的是離散化後長度為1的線段。跟區間更新啥的還是挺像的,就是那些乙個葉子節點表示乙個點,這個是表...