樹套樹 BZOJ 3110 K大數

2022-08-30 23:12:30 字數 896 閱讀 5585

通道

題意:有n個位置,m個操作。操作有兩種,每次操作如果是1 a b c的形式表示在第a個位置到第b個位置,每個位置加入乙個數c,如果是2 a b c形式,表示詢問從第a個位置到第b個位置,第c大的數是多少

思路:先開一顆權值線段樹。對於當前結點k,它表示了權值範圍為a~b的所有結點的資訊。但是有人要問:這樣怎麼控制位置範圍是l~r這個要求呢?我們可以在這個點上再開一棵

表示位置的資訊。那麼在第二重樹中的結點sum[k]表示在a~b的權值範圍內,位置範圍是l~r的點的個數。查詢的時候是bst原理

**:

#include#include

using

namespace

std;

const

int n=50000+5

;const

int m=n*16*16

;int root[n*4

],n,m,sum[m],left[m],right[m],lazy[m],c,l,r,cnt,opt;

void put(int &k,int l,int

r)

int mid=(l+r)/2;

if (l<=mid) put(left[k],l,mid);

if (r>mid) put(right[k],mid+1

,r);

sum[k]=sum[left[k]]+sum[right[k]]+lazy[k]*(r-l+1);}

void update(int now,int l,int

r)int calc(int k,int l,int

r)int ask(int now,int l,int

r) int

main()

return0;

}

view code

bzoj 3110 K大數查詢 樹套樹

題目傳送門 time limit 20 sec memory limit 512 mb submit 5039 solved 1751 submit status discuss 有n個位置,m個操作。操作有兩種,每次操作如果是1 a b c的形式表示在第a個位置到第b個位置,每個位置加入乙個數c ...

BZOJ 3110 k大數查詢 樹套樹

5e4個可重集合,初試全空,5e4個操作 1.在第 l,r 集合裡加入乙個數c 2.問 l,r 所有集合的並的第k大數 發現很多題解都寫得權值線段樹套區間線段樹啊,我覺得這題反過來套比較直白吧。不過寫了一半陷入了奇怪的思維漩渦裡。就跟著題解寫了個權值套區間線段樹,在luogu上開了o2,加了讀入掛,...

BZOJ 3110 K大數查詢 樹套樹

題目鏈結 權值線段樹套區間線段樹,權值線段樹的每個結點儲存該結點所表示的區間範圍內的數在各個區間的分布情況,查詢時在權值線段樹上二分即可。複雜度 o nlog 2n 注意區間線段樹需要動態開點,並且標記要永久化,否則會tle。另外就是sum可能會爆int,需要用long long儲存。1 inclu...