題目讓我們求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...