洛谷 P3332 ZJOI2013 K大數查詢

2021-09-21 07:41:25 字數 1669 閱讀 7239

題目:k大數查詢

思路:整體二分。

維護兩個區間[l,r]和[l,r],分別代表二分的答案區間,和可以滿足答案的詢問區間。

在[l,r]上二分m。

對於1操作,如果v小於m,在[q.l,q.r]上用線段樹實現區間加一,值賦1,否則賦0。

對於2操作,詢問[q.l,q.r]上的數的個數s,若v小於等於s,值賦1,否則賦0。

注意long long的使用,以及線段樹打標記清空。

**:

#include

using

namespace std;

#define maxn 50000

#define ll long long

#define readll(x) scanf("%lld",&x)

#define read(x) scanf("%d",&x)

struct seg

#define lson o*2

#define rson o*2+1

void

init()

void

push_down

(int o,

int l,

int mid,

int r)

lzy[lson]

+=lzy[o]

,lzy[rson]

+=lzy[o]

; c[lson]

+=lzy[o]

*(mid-l+1)

,c[rson]

+=lzy[o]

*(r-mid)

; lzy[o]=0

;}void

push_up

(int o)

void

add(

int o,

int l,

int r)

if(l>q||rreturn

;add

(lson,l,mid)

,add

(rson,mid+

1,r)

;push_up

(o);}

ll query

(int o,

int l,

int r)};

seg seg,emp;

struct q

bool

operator

<

(const q& oth)

const};

int n,m;

q q[maxn+5]

;int ans[maxn+5]

;void

readin()

}void

binsearch

(int l,

int r,

int l,

int r)

seg.

init()

;int m=

(l+r)/2

,t=l-1;

for(

int i=l;i<=r;i++

)else

}sort

(q+l,q+r+1)

;binsearch

(l,m,l,t)

,binsearch

(m+1

,r,t+

1,r);}

intmain()

洛谷P3332 ZJOI2013 K大數查詢

description 帶區間修求區間第kkk大 資料範圍 n 5 104 n leq 5 times 10 4 n 5 104so luti on solution soluti on字首和套主席樹可以解決靜態 樹狀陣列套主席樹可以解決單點修改區間查詢 貌似在這道題,外層套乙個可以區間修改區間查詢...

洛谷P3332 ZJOI2013 K大數查詢

題目大意 有 n 個位置,m 個操作。操作有兩種 2 l r k 詢問 l,r 中第 k 大的數是多少。題解 樹套樹,權值線段樹套位置線段樹,要標記永久化,不然會 tle 卡點 沒有標記永久化,tle 然後處理 tag 部分寫錯 c code include include include name...

P3332 ZJOI2013 K大數查詢

有n個位置,m個操作。操作有兩種,每次操作如果是1 a b c的形式表示在第a個位置到第b個位置,每個位置加入乙個數c如果是2 a b c形式,表示詢問從第a個位置到第b個位置,第c大的數是多少。輸入格式 第一行n,m接下來m行,每行形如1 a b c或2 a b c 輸出格式 輸出每個詢問的結果 ...