思路:在寫這題以前,強烈推薦先寫完hdu1542
然後這題相對於上面一題的區別就在於這題要求的是求覆蓋兩次的面積,上一題只要覆蓋1次的面積.
所以總的來說,區別主要是在與push_up這個函式上
void push_up(int rt, int l, int r)
注意:好像這個並不用build的
推薦大佬部落格,關於pushup解釋的很詳細
貼上我的非結構**
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define eps 1e-8
#define inf 0x3f3f3f3f
#define mod 1e9+7
#define pi acos(-1)
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
using
namespace
std;
typedef
long
long ll;
typedef
unsigned
long
long ull;
const
int maxn = 2e5 + 5;
double sum[maxn], sum2[maxn];//要開double
int t, n, col[maxn];
//sum陣列是覆蓋了一次的線段長度,sum2陣列是覆蓋了兩次的線段長度,col用來標記區間被完全覆蓋了幾次
double x[maxn];//離散化陣列
int cnt = 0; //離散化大小
struct node
node() {}
node(double a, double b, double c, int d): l(a), r(b), h(c), flag(d) {}
} ss[maxn];
void push_up(int rt, int l, int r)
int bin(double key, int k)
return -1;
}void updata(int l, int r, int l, int r, int rt, int flag)
int mid = (l + r) >> 1;
if(mid >= l) updata(l, r, lson, flag);
if(mid < r) updata(l, r, rson, flag);
push_up(rt, l, r);
}int main() ;
x[cnt] = x2;
ss[cnt++] = ;
}sort(ss, ss + cnt);
sort(x, x + cnt);
int k = unique(x, x + cnt) - x;
double ans = 0;
for(int i = 0; i < cnt - 1; i++)
printf("%.2f\n", ans);
}return
0;}
hdu 1255 覆蓋的面積 掃瞄線
一道挺簡單的題,讓我折騰了許久。主要卡在了更新節點後維護父親節點上。後來思路明確了就很容易了。節點資訊 l,r 區間端點 cnt 區間被覆蓋的次數,cnt 0說明沒有被完全覆蓋。len1 區間被覆蓋的長度 len2 區間至少被兩條線段覆蓋的長度。只要找到父親節點與子節點在len1,len2,cnt的...
覆蓋的面積 HDU 1255(掃瞄線求面積交)
題意 就是掃瞄線求面積交 解析 參考求面積並。就是把down的判斷條件改了一下。由w 0 改為 w 1 同時要討論一下 1 時 的情況,所以就要用到乙個臨時的sum。具體看 把 include include include include include include include inclu...
HDU 1255 覆蓋的面積 線段樹 掃瞄線
還是先離散化座標,然後用線段樹掃瞄線 其中sum代表被覆蓋過一次的長度,sum2代表被覆蓋過2次及以上的長度。然後注意pushup操作比較麻煩。id sdj22251 prog subset lang c include include include include include include...