BZOJ 4399 魔法少女LJJ(線段樹合併)

2022-05-14 11:30:08 字數 2029 閱讀 7139

現在分析線段樹合併的複雜度,舉乙個最基本的例子:權值為\([1,n]\) ,\(n\) 棵動點線段樹,每個線段樹插入了乙個權值,那麼總共有 \(n\log n\) 個點,而每一次合併相當於少掉了乙個點,那麼合併完這 \(n\) 棵線段樹後複雜度就是消失的點的個數,不會超過總共的點數,所以複雜度是 \(n \log n\) 的。

類似的,對最一般的情況,也是一樣的分析方法,最後得出線段樹合併的複雜度為節點個數的結論。

#include#define for(i,x,y) for(int i=(x),i##end=(y);i<=i##end;++i)

#define dor(i,x,y) for(int i=(x),i##end=(y);i>=i##end;--i)

typedef long long ll;

using namespace std;

const int n=4e5+5;

const int nn=n*12;

struct segmenttree

; }

}; node nd[nn];

int lson[nn],rson[nn],rt[n],tot;

int &operator (const int x)

void build()

; lson[0]=rson[0]=0;

} void create(int &k)

void update(int &k,int x,int addcnt,double addsum,int l,int r)

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

if(x<=mid)update(lson[k],x,addcnt,addsum,l,mid);

else update(rson[k],x,addcnt,addsum,mid+1,r);

nd[k]=nd[lson[k]]+nd[rson[k]];

} int sweep_off(int &k,int l,int r,int l,int r)

int mid=(l+r)>>1,res=0;

if(l<=mid)res+=sweep_off(lson[k],l,r,l,mid);

if(r>mid)res+=sweep_off(rson[k],l,r,mid+1,r);

nd[k]=nd[lson[k]]+nd[rson[k]];

return res;

} int querycnt(int k)

double querysum(int k)

int querykth(int k,int k,int l,int r)

void merge(int &x,int y,int l,int r)

if(l==r)

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

merge(lson[x],lson[y],l,mid);

merge(rson[x],rson[y],mid+1,r);

nd[x]=nd[lson[x]]+nd[rson[x]];

}}st;

int n,m,fa[n];

int op[n],a[n],b[n];

int disc[n],tot;

double logdisc[n];

int getfa(int k)

int main()

for(i,1,m)

sort(disc+1,disc+1+tot);

tot=unique(disc+1,disc+1+tot)-disc-1;

for(i,1,m)

for(i,1,tot)logdisc[i]=log(disc[i]);

st.build();

for(i,1,m)

else if(op[i]==2)

else if(op[i]==3)

else if(op[i]==4)

else if(op[i]==5)

else if(op[i]==6)

else if(op[i]==7)

}return 0;

}

bzoj4399 魔法少女LJJ

bzoj4399 魔法少女ljj 在森林中見過會動的樹,在沙漠中見過會動的仙人掌過後,魔法少女ljj已經覺得自己見過世界上的所有稀奇古怪的事情了 ljj感嘆道 這裡真是個迷人的綠色世界,空氣清新 淡雅,到處散發著醉人的奶漿味 小猴在枝頭悠來蕩去,好不自在 各式各樣的鮮花爭相開放,各種樹枝的枝頭掛滿沉...

BZOJ 4399 魔法少女LJJ 線段樹

傳送門 出題人真會玩。操作 2 線段樹合併,然後每棵線段樹維護元素個數和。對於 6 這個詢問,因為乘積太大,所以要用對數。時間複雜度 o nlogn include include include include includeusing namespace std const int n 4000...

BZOJ 4399 魔法少女LJJ 線段樹合併

題目大意 第一行有乙個正整數m,表示操作個數。接下來m行,每行先給出1個正整數c。若c 1,之後乙個正整數x,表示新建乙個權值為x的節點,並且節點編號為n 1 當前有n個節點 若c 2,之後兩個正整數a,b,表示在a,b之間連線一條邊。若c 3,之後兩個正整數a,x,表示a聯通塊內原本權值小於x的節...