線段樹 二分 HDU6070

2021-10-07 20:09:09 字數 1846 閱讀 3142

題目讓我們求type(l,r)/(r-l+1)的最小,顯然可以用01分數規劃,來二分求最小答案。所以我們從左往右移動端點,來統計種類。線段樹來維護type(l,r)+l*mid的值。

#include

using

namespace std;

const

int n =

1e6+7;

const

double eps =

1e-7

;double sum[n]

;int lazy[n]

;int pre[

60007];

int a[

60007];

int n;

void

build

(int l,

int r,

int rt,

double mi)

int mid =

(l + r)

>>1;

build

(l, mid, rt <<

1, mi)

;build

(mid +

1, r, rt <<1|

1, mi)

; sum[rt]

=min

(sum[rt<<1]

, sum[rt<<1|

1]);

}void

pushdown

(int rt)

void

update

(int l,

int r,

int rt,

int l,

int r)

if(lazy[rt]

)pushdown

(rt)

;int mid =

(l + r)

>>1;

if(l <= mid)

update

(l, mid, rt<<

1, l, r);if

(r > mid)

update

(mid+

1, r, rt<<1|

1, l, r)

; sum[rt]

=min

(sum[rt<<1]

, sum[rt<<1|

1]);

}double

query

(int l,

int r,

int rt,

int l,

int r)

if(lazy[rt]

)pushdown

(rt)

;int mid =

(l + r)

>>1;

double tmp =

1e9;

if(l <= mid) tmp =

min(tmp,

query

(l, mid, rt<<

1, l, r));

if(r > mid) tmp =

min(tmp,

query

(mid+

1, r, rt<<1|

1, l, r));

return tmp;

}int

check

(double mid)

return0;

}int

main()

double l =

0, r =1;

while

(r - l > eps)

printf (

"%0.5f\n"

, l);}

return0;

}

hdu6070 線段樹 二分

題意給你乙個區間,讓你找,區間種類數 區間長度最小是多少。思路先公式化簡 size r l 1 mid size l 1 mid r mid mid是二分的值 對於每乙個元素a i 他能影響的區間是,last a i 1 到i last表示這個這個元素上一次出現的位置 他能讓這個區間的種類數 1,由...

hdu 6070 二分答案 線段樹

題意 區間價值為 區間元素種類數 區間長度 問最小價值的區間是?思路 直接求解很困難,考慮二分答案判斷,注意這題的關鍵是將二分答案後的不等式進行變換,如官方題解。二分答案 mid,檢驗是否存在乙個區間滿足 size l,r r l 1 mid,也就是 size l,r mid l mid r 1 之...

HDU 6070題解 二分 線段樹

傳送門 此題的題意不是很清晰,要注意的一點是在區間 l,r 中,預設題目編號最後一次出現的時候是ac的 比如1 2 1 2 3 在區間 1,4 中,第3次提交時ac第1題,第4次提交時ac第2題,故比例為2 4 0.5 所以此問題可以轉化為 給定乙個序列,定義區間 l,r 的值為cn t l,r r...