題面:洛谷
離線演算法好啊(廢話,不然為什麼離線)!這道題帶區間修改查詢\(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...