LOJ6066 雜湊,dfs序(括號序列)

2021-10-03 21:33:27 字數 1969 閱讀 5045

首先想到的是樹雜湊,但其實不然,因為本題說兒子的順序也要一致,因此我們考慮dfs序(即樹的括號序列),我們將整棵樹的dfs

dfsdf

s序轉換為乙個序列,對其進行雜湊,然後注意到k

kk值是具有二分單調性的(證明很顯然),於是我們對k

kk值進行二分,然後che

ckcheck

check。

至於c he

ckcheck

chec

k的方法就是:假設當前二分值為mid,那麼我們將所有點掛在它的mid

+1mid+1

mid+

1級祖先上(開棧),這樣每次計算每個節點的u−m

idu-mid

u−mi

d子樹時可以方便加入合法的一段序列

#include

#include

#define m 200009

//要開雙倍,因為dfs序

#define ll unsigned long long

using

namespace std;

using

namespace tr1;

intread()

for(

;isdigit

(ch)

;ch=

getchar()

) re=

(re<<3)

+(re<<1)

+ch-

'0';

return re*f;

}const ll h=37;

ll nxt[m]

,first[m]

,to[m]

,tot,cnt,n,num[m]

,len[m]

,ed[m]

,sta[m]

,top;

ll val[m]

,mi[m]

,has[m]

;vectorson[m]

;unordered_mapmp;

void

add(

int x,

int y)

void

dfs1

(int x)

ed[x]

=++cnt,len[x]

++,val[cnt]

=233;}

void

dfs2

(int u,

int k)

top--;}

ll gethas

(int l,

int r)

bool

check

(int mid)

r=ed[i]

; ans=ans*mi[r-l+1]

+gethas

(l,r);if

(mp.

count

(ans)

)return

true

; mp[ans]=1

;}return

false;}

intmain()

dfs1(1

),mi[0]

=1;for

(int i=

1;i<=cnt;i++

) mi[i]

=mi[i-1]

*h;for

(int i=

1;i<=cnt;i++

) has[i]

=has[i-1]

*h+val[i]

;int l=

2,r=n;

while

(lprintf

("%d\n"

,l);

return0;

}

UBUNTU6 06官方源列表

將以下列表儲存到 etc apt sources.list 可以將原來的清空 中文eva 如果你想安裝中文的eva的話請將其他所有源注釋掉然後再sudo apt get update後就可以sudo apt get install eva,裝完後eva就是中文的了 ubuntu.cnsite.org...

ES6 06箭頭函式和this

要點 1.箭頭函式 2.this繫結 一.箭頭函式 1.es6新增乙個使用 箭頭符號定義函式的語法特徵 let fn name name console.log fn mr.lee 翻譯成函式 為 let fn function name 2.箭頭函式也可以傳遞兩個或以上的引數,並實現運算後返回 l...

LOJ 皇宮看守

題目鏈結 點加權的最小覆蓋 題目說的很清楚,用最少的點覆蓋所有的點。題目給出的是個樹,所以可以用動態規劃來解決。給出如下定義 f i,0 表示i點不放,i可以被父親節點觀察到 f i,1 表示i點不放,i可以被兒子節點觀察到 f i,2 表示i點放,在i處設定警衛 轉移如下 1 由f i,0 定義可...