3332 ZJOI2013 K大數查詢

2022-05-07 23:06:16 字數 1097 閱讀 3850

題面:洛谷

離線演算法好啊(廢話,不然為什麼離線)!這道題帶區間修改查詢\(k\)小值,如果樹套樹,要用線段樹套線段樹,外層維護權值,裡層維護區間,複雜度\(o(n\log^)\),但我們可以用整體二分,雖然複雜度也是\(o(n\log^)\),但是常數小啊,**又好寫。依然是二分第\(k\)小的數值,用樹狀陣列維護即可(常數小)。

#include#define ll long long

#define n 50005

#define i inline

using namespace std;

int n,m,id[n],t1[n],t2[n],ans[n];

struct qq[n];

ll a1[n],a2[n];

i int in()

i int lb(int x)

i void add1(int x,int c)

i ll sum1(int x)

i void add2(int x,int c)

i ll sum2(int x)

i void modify(int l,int r,int c)

i ll query(int l,int r)

void solve(int l,int r,int ql,int qr)

int mid=(l+r+1)/2,p1=0,p2=0;

for(int i=ql,u;i<=qr;++i)

if(q[u].op==2)

} for(int i=ql,u;i<=qr;++i)

for(int i=ql;i<=ql+p1-1;++i) id[i]=t1[i-ql+1];

for(int i=ql+p1;i<=qr;++i) id[i]=t2[i-ql-p1+1];

solve(mid,r,ql,ql+p1-1); solve(l,mid-1,ql+p1,qr);

}int main()

solve(-n,n,1,m);

for(int i=1;i<=m;++i) if(q[i].op==2) printf("%d\n",ans[i]);

return 0;

}

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

題解 P3332 ZJOI2013 K大數查詢

link 你需要維護 n 個可重整數集,集合的編號從 1 到 n 這些集合初始都是空集,有 m 個操作 1 leq n m leq 10 5 1 leq c leq 2 發現插入,查詢 k 大,考慮線段樹套平衡樹。但是發現 n m leq 10 5 並且區間插入並不好打懶標記,比較麻煩。並且因為平衡...

洛谷 P3332 ZJOI2013 K大數查詢

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