首先想到的是樹雜湊,但其實不然,因為本題說兒子的順序也要一致,因此我們考慮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 定義可...