hdu6070 線段樹 二分

2021-08-04 23:01:53 字數 1385 閱讀 1489

題意給你乙個區間,讓你找,區間種類數/區間長度最小是多少。

思路先公式化簡 size/(r - l + 1) <= mid –> size + (l - 1)mid <= r * mid;(mid是二分的值)

對於每乙個元素a[i],他能影響的區間是,last[a[i]] + 1 , 到i(last表示這個這個元素上一次出現的位置),他能讓這個區間的種類數+1,由於我們需要快速的找到上面的最小的一坨(size + (l - 1)*mid),所以應該用線段樹來維護這一坨。然後就是線段樹插的問題。(這個問題我想了好久好久,然後這麼回事,每一次,你就想他的l,r都是他的座標,那麼這個l就是當前的i)然後在每個i位置,把上面的一坨插進去。插進去之後,發現他能影響前面的一段區間,就把那個區間整體的值+1(不能把所有的插完再詢問區間,因為你全部插完之後,可能後面的元素不選,但是他還是影響了前面的元素,所以不能選)。

插完之後,找到最小值,比較一下就可以了(和之前二分的答案比)。

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

typedef

long

long ll;

const

int n = 1e5 + 10;

double setv[n * 4] , minv[n * 4] , v , _min;

int pl , pr , n;

int last[n] , now[n] , a[n];

void pushup(int o , int l , int r)

minv[o] += setv[o];

}void update(int o , int l , int r)

pushup(o , l , r);

}void query(int o , int l , int r , double add)

}bool check(double ratio)

return0;}

int main()

double l = 0 , r = 1 , m;

for(int i = 1 ; i <= 30 ; i++)

printf("%lf\n",r);

}return

0;}

線段樹 二分 HDU6070

題目讓我們求type l,r r l 1 的最小,顯然可以用01分數規劃,來二分求最小答案。所以我們從左往右移動端點,來統計種類。線段樹來維護type l,r l mid的值。include using namespace std const int n 1e6 7 const double eps...

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...