b vj K th Number(二分 線段樹)

2022-02-24 13:13:30 字數 781 閱讀 4162

有乙個數列a[1~n]中 (數字各不相同),輸入m行i,j,k,目的是求a[i...j]之間第k小的數

#includeusing namespace std;

typedef long long ll;

const int n=1e6+5;

ll n,m,a[n];

vectort[n];

void pushup(int k)

void build(int l, int r, int k)

int m=l+r>>1;

build(l,m,k<<1);

build(m+1,r,k<<1|1);

t[k].resize(r-l+1);

pushup(k);

}int ask(int ql, int qr, int l, int r, int k, ll num)

int m=l+r>>1, ans=0;

if (m>=ql) ans+=ask(ql,qr,l,m,k<<1,num);

if (m>1;

if (ask(s,e,1,n,1,m)>n>>m; for (int i=1; i<=n; i++) cin>>a[i];

build(1,n,1);

for (int i=0; i>l>>r>>k;

cout<建樹複雜度:遍歷了logn層,每層的merge函式累積遍歷n個元素

查詢複雜度:mloglog(e-s)

感覺比按雙字段排序還要慢一點...

hdu4614 二分 線段樹

題意 給你1 n的花瓶 剛開始全是空的,現在有兩種操作,1 從花瓶a開始插入b朵花 如果不能插進去 輸出字串 否則輸出最多插入的起點和終點 結構體陣列num i 表示節點i空瓶的數目 線段樹 開始deal函式對整個樹初始化,update 更新函式 find 查詢區間有多少個空瓶 對於操作1 關鍵點是...

HDU 5649 二分 線段樹

題意 給出乙個排列,每次操作 l,r 區間的數原地公升序或者降序,詢問最後k下標的數。二分最後的結果mid,然後把比mid大的換成1,小於等於mid的換成0,那麼公升序降序相當於求出區間中0的個數然後把前半段和後半段分別用0 1覆蓋。這樣只需要維護乙個區間查詢,區間修改的線段樹即可。include ...

Codeforces460C 二分 線段樹

二分最小值,如果你能實現這個最小值是可以實現的,那麼一定是最優的,因為每次區間 1,原來存在的最小值的個數還是存在的,但是新的可能會多起來,所以最小值遞增還是最優到最優的 考慮如果不能實現這個最小值,那麼他一定是比之前這個值少的,因為最小值不變,而且個數變少 區間維護可以線段樹。include us...