BZOJ3110 K大數查詢 線段樹套線段樹

2021-07-01 22:13:29 字數 997 閱讀 4491

媽呀這題好神好神好神。。我發現主席樹好像做不了呀。。咋全寫的是線段樹套線段樹呢。。後來還是看黃學長的**看懂了。。果然我是看黃學長部落格長大的。。有兩種做法,大部分人是外層權值線段樹,內層區間線段樹,這個我寫了,還是很好寫。。lyd給了一種外層區間內層權值的做法,沒看懂。。內層區間[l1,r1]在外層權值區間[l,r]下的意義是在[l1,r1]內有多少權值在[l,r]之間的數。。由於一開始是空的,每次最多訪問nlog^2 n個節點,所以我們用實時開點,空間複雜度o(nlog^2 n)。。具體的還是好好看**。。

#include#include#define n 200005

using namespace std;

int n,m,opt,a,b,c,i,nd=0,root[n],lc[100*n],rc[100*n],sum[100*n],tag[100*n];

void mark(int &x,int l,int r,int c)

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

void update(int &x,int l,int r,int a,int b)

int mid=(l+r)>>1;

if (b<=mid) update(lc[x],l,mid,a,b);

else if (a>mid) update(rc[x],mid+1,r,a,b);

else update(lc[x],l,mid,a,mid),update(rc[x],mid+1,r,mid+1,b);

sum[x]=sum[lc[x]]+sum[rc[x]];

}void insert(int a,int b,int c)

update(root[now],1,n,a,b);

}int query(int x,int l,int r,int a,int b)

int solve(int a,int b,int k)

return l;

}int main()

}

BZOJ 3110, K大數查詢

傳送門 要求維護乙個數列,支援在某部分的每個位置填上乙個數以及查詢某部分第k大的數字。終於學習了一下樹套樹的姿勢 其實和自己想的也差不多 但是不學還是打不出 來 外層是權值線段樹,內層是區間線段樹。要注意的細節比較多。二分查詢過程中結果可能超過maxlongint,需要用unsigned int型別...

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,加了讀入掛,...