bzoj4399 魔法少女LJJ

2021-09-16 23:37:31 字數 2990 閱讀 1837

bzoj4399: 魔法少女ljj

在森林中見過會動的樹,在沙漠中見過會動的仙人掌過後,魔法少女ljj已經覺得自己見過世界上的所有稀奇古怪的事情了

ljj感嘆道「這裡真是個迷人的綠色世界,空氣清新、淡雅,到處散發著醉人的奶漿味;小猴在枝頭悠來蕩去,好不自在;各式各樣的鮮花爭相開放,各種樹枝的枝頭掛滿沉甸甸的野果;鳥兒的歌聲婉轉動聽,小河裡飄著落下的花瓣真是人間仙境」

shy覺得ljj還是太*****,一天,shy帶著自己心愛的圖找到ljj,對ljj說:「既然你已經見識過動態樹,動態仙人掌了,那麼今天就來見識一下動態圖吧」

ljj:「要支援什麼操作?」

shy:「

1.新建乙個節點,權值為x。

2.連線兩個節點。

3.將乙個節點a所屬於的聯通快內權值小於x的所有節點權值變成x。

4.將乙個節點a所屬於的聯通快內權值大於x的所有節點權值變成x。

5.詢問乙個節點a所屬於的聯通塊內的第k小的權值是多少。

6.詢問乙個節點a所屬聯通快內所有節點權值之積與另乙個節點b所屬聯通快內所有節點權值之積的大小。

7.詢問a所在聯通快內節點的數量

8.若兩個節點a,b直接相連,將這條邊斷開。

9.若節點a存在,將這個點刪去。

」ljj:「我可以離線嗎?」

shy:「可以,每次操作是不加密的,」

ljj:「我可以暴力嗎?」

shy:「自重」

ljj很鬱悶,你能幫幫他嗎

第一行有乙個正整數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點的所有連邊

具體輸出格式見樣例

121 2

1 31 4

1 51 6

2 1 2

2 2 3

2 3 4

2 4 5

9 13 2 5

5 3 4

6對100%的資料 0<=m<=400000,c<=7,所有出現的數均<=1000000000,所有出現的點保證存在

【hint】請認真閱讀題面

啊4399 小遊戲?

【hint】請認真閱讀題面 c<=7

於是我們只需支援合併。

考慮用權值線段樹維護<=k的有幾個,合併時就線段樹合併。

修改是先查詢size,再在x點打上標記。

這時線段樹合併先pushdown()再合併。

還剩乙個棘手的操作6。權值太大存不下,我們取ln(x),然後比較ln的大小。

注意注意注意:線段樹合併不能用pushup(x)來維護,邊界會炸。

調的欲哭無淚啊

#include#include

#include

#include

#include

#include

#define maxn 400005

#define max 1000000000

using

namespace

std;

intm,op,t1,t2,t3,f[maxn],tot,cnt;

intrt[maxn];

struct

nodetr[maxn*10

];int getf(int k)

void wh(int

k)void upd(int

k)void down(intk)}

void add(int &k,int l,int r,int pl,int

v) down(k);

int mid=l+r>>1

;

if(pl<=mid)add(tr[k].ls,l,mid,pl,v);

else add(tr[k].rs,mid+1

,r,pl,v);

wh(k);

}int merge(int x,int

y)int lian(int k,int l,int r,int li,int

ri) down(k);

int mid=l+r>>1;int sz=0

;

if(li<=mid)sz+=lian(tr[k].ls,l,mid,li,ri);

if(ri>mid)sz+=lian(tr[k].rs,mid+1

,r,li,ri);

wh(k);

return

sz;}

int kth(int k,int l,int r,int

kth)

intmain()

if(op==2

) }

if(op==3

)

if(op==4

)

if(op==5

)

if(op==6

)

if(op==7

) }

return0;

}

view code

posted @

2019-04-06 21:10

liankewei123456 閱讀(

...)

編輯收藏

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

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

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