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#includeview code#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;
}
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 的。類似的,對最一般的...