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

2021-07-30 13:28:31 字數 2242 閱讀 3896

題目大意:第一行有乙個正整數m,表示操作個數。

接下來m行,每行先給出1個正整數c。

若c=1,之後乙個正整數x,表示新建乙個權值為x的節點,並且節點編號為n+1(當前有n個節點)。

若c=2,之後兩個正整數a,b,表示在a,b之間連線一條邊。

若c=3,之後兩個正整數a,x,表示a聯通塊內原本權值小於x的節點全部變成x。

若c=4,之後兩個正整數a,x,表示a聯通塊內原本權值大於x的節點全部變成x。

若c=5,之後兩個正整數a,k,表示詢問a所屬於的聯通塊內的第k小的權值是多少。

若c=6,之後兩個正整數a,b,表示詢問a所屬聯通塊內所有節點權值之積與b所屬聯通塊內所有節點權值之積的大小,

若a所屬聯通塊內所有節點權值之積大於b所屬聯通塊內所有節點權值之積,輸出1,否則為0。

若c=7,之後乙個正整數a,表示詢問a所在聯通塊大小

若c=8,之後兩個正整數a,b,表示斷開a,b所連線的邊。

若c=9,之後乙個正整數a,表示斷開a點的所有連邊

c<=7

將乙個聯通塊合併刪除,可以建權值線段樹,動態開點,使用線段樹合併。

3、4操作即插入 等於大於/小於x的數的個數 的x,然後將小於/大於x的數全部刪除。

6操作可以將乘積轉為對數加法(不過好像不轉也可以..),反正也只是比較大小..

好像不寫記憶體**會**的把..在delete以後一定再賦值成null

#include 

#include

#include

#define n 400001

#define m 1000000000

using

namespace

std;

deque

recycle;

struct node

void* operator

new(size_t)

static node *mempool,*c;

if(mempool==c) mempool=(c=new node[1

<<20])+(1

<<20);

return c++;

}void

operator

delete(void* tmp)

void maintain()

}*root[n];

int t,n,pa[n];

inline

int find_pa(int x)

void insert(node*& o,int pos,int val,int l,int r)

int mid=l+r>>1;

if(pos<=mid) insert(o->ch[0],pos,val,l,mid);

else insert(o->ch[1],pos,val,mid+1,r);

o->maintain();

return ;

}void merge(node*& x,node*& y)

x->siz+=y->siz, x->sum+=y->sum;

merge(x->ch[0],y->ch[0]), merge(x->ch[1],y->ch[1]);

return ;

}void clear(node*& o,int l,int r,int l,int r)

int mid=l+r>>1;

if(r<=mid) clear(o->ch[0],l,r,l,mid);

else

if(l>mid) clear(o->ch[1],l,r,mid+1,r);

else clear(o->ch[0],l,mid,l,mid), clear(o->ch[1],mid+1,r,mid+1,r);

o->maintain();

return ;

}int query_siz(node* o,int l,int r,int l,int r)

int query_kth(node* o,int x,int l,int r)

int main()

case

2: case

3: case

4: case

5: case

6: case

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(線段樹合併)

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