BZOJ 3110, K大數查詢

2021-07-26 16:33:45 字數 1003 閱讀 2728

傳送門

要求維護乙個數列,支援在某部分的每個位置填上乙個數以及查詢某部分第k大的數字。

終於學習了一下樹套樹的姿勢……其實和自己想的也差不多……但是不學還是打不出**來……

外層是權值線段樹,內層是區間線段樹。

要注意的細節比較多。二分查詢過程中結果可能超過maxlongint,需要用unsigned int型別傳遞;權值可以翻轉後整體右移等等。

但最主要的還是實現樹套樹啦~~~

#include

const int n=50000,l=100001,m=16000005;

int n,m,cmd,a,b,c,cnt,root[m],ls[m],rs[m];

unsigned int

sum[m],tag[m];

void read(int &x)

void down(int o,int l,int r)

void modify(int &o,int l,int r,int ql,int qr)

int mid=l+r>>1;

if(qr<=mid) modify(ls[o],l,mid,ql,qr);

else

if(ql>mid) modify(rs[o],mid+1,r,ql,qr);

else

sum[o]=sum[ls[o]]+sum[rs[o]];

}void insert(int o,int l,int r,int a,int b,int q)

modify(root[o],1,n,a,b);

}unsigned int find(int o,int l,int r,int ql,int qr)

int query(int o,int l,int r,int a,int b,unsigned int c)

return l;

}int main()

return

0;}

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