BZOJ 3110 K大數查詢 樹套樹

2022-08-18 07:33:17 字數 1018 閱讀 2460

題目鏈結

權值線段樹套區間線段樹,權值線段樹的每個結點儲存該結點所表示的區間範圍內的數在各個區間的分布情況,查詢時在權值線段樹上二分即可。複雜度$o(nlog^2n)$

注意區間線段樹需要動態開點,並且標記要永久化,否則會tle。

另外就是sum可能會爆int,需要用long long儲存。

1 #include2

using

namespace

std;

3 typedef long

long

ll;4 typedef double

db;5

const

int n=5e4+10;6

#define lson (u<<1)

7#define rson (u<<1|1)

8#define mid ((l+r)>>1)

9int n,m,rt[n<<2],ls[n*200],rs[n*200

],tot;

10 ll mk[n*200],sum[n*200

];11

int newnode()

12void upd2(int l,int r,int x,int& u,int l=1,int r=n)

15if(l>r||rreturn

;16 upd2(l,r,x,ls[u],l,mid),upd2(l,r,x,rs[u],mid+1

,r);

17 sum[u]+=(ll)(min(r,r)-max(l,l)+1)*x;18}

19 ll qry2(int l,int r,int& u,int l=1,int r=n)

24void upd(int p,int l,int r,int u=1,int l=1,int r=n)

29int qry(int l,int r,int k,int u=1,int l=1,int r=n)

34int

main()

42return0;

43 }

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大數

通道 題意 有n個位置,m個操作。操作有兩種,每次操作如果是1 a b c的形式表示在第a個位置到第b個位置,每個位置加入乙個數c,如果是2 a b c形式,表示詢問從第a個位置到第b個位置,第c大的數是多少 思路 先開一顆權值線段樹。對於當前結點k,它表示了權值範圍為a b的所有結點的資訊。但是有...