BZOJ 4399 魔法少女LJJ 線段樹

2022-05-12 09:29:14 字數 1199 閱讀 3564

傳送門

出題人真會玩。。操作\(2\)線段樹合併,然後每棵線段樹維護元素個數和。對於\(6\)這個詢問,因為乘積太大,所以要用對數。時間複雜度\(o(nlogn)\)

#include#include#include#include#includeusing namespace std;

const int n=400005;

const int m=2000005;

inline int rd()

int m,tot,rt[m],f[m],num,cpy[n],cnt,a[n],u,tmp;

struct queryq[n];

struct segment_tree

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

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

ls[x]=merge(ls[x],ls[y],l,mid);

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

siz[x]=siz[ls[x]]+siz[rs[x]];

mul[x]=mul[ls[x]]+mul[rs[x]];

return x;

}void erase(int x,int l,int r,int l,int r)

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

if(l<=mid) erase(ls[x],l,mid,l,r);

if(mid>1;

if(siz[ls[x]]>=k) return kth(ls[x],l,mid,k);

else

}}tree;

int get(int x)

int main()

sort(cpy+1,cpy+1+cnt); u=unique(cpy+1,cpy+1+cnt)-cpy-1;

for(int i=1;i<=m;i++)

else if(q[i].op==2)

else if(q[i].op==3)

else if(q[i].op==4)

else if(q[i].op==5)

else if(q[i].op==6)

else if(q[i].op==7) printf("%d\n",tree.siz[rt[get(q[i].x)]]);

}return 0;

}

bzoj4399 魔法少女LJJ

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

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

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

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