題目: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 輸出格式 輸出每個詢問的結果 ...