應用
一.解題思路:該題需要考慮每條邊給答案帶來的貢獻,通過簡單的畫圖和思考我們可以發現,當乙個節點下有偶數個葉子節點時,該節點到父親節點的邊的貢獻為2,若為奇數則為1,那麼最後的答案為n−2
+sig
ma(d
u[i]
mod2
==0)
n-2+sigma(du[i]mod 2==0)
n−2+si
gma(
du[i
]mod
2==0
),利用樹鏈剖分維護即可
int n, q, rt, sum;
const
int n =
2e5+5;
struct node tr[n<<2]
;vector <
int> edge[n]
;int deg[n]
;int value[n]
;//節點值
int fa[n]
, deep[n]
, son[n]
, siz[n]
;int dfn[n]
,top[n]
, id[n]
, tot =0;
void dfs1 (
int u)}}
void dfs2 (
int u,
int t)
void push_up (
int i)
void push_down (
int i)
}void build (
int i ,
int l ,
int r)
int mid =
(l + r)
>>1;
build (i <<
1, l , mid)
; build (i <<1|
1, mid +
1,r)
; push_up (i);}
void update (
int i ,
int l ,
int r,
int l ,
int r)
push_down
(i);
int mid =
(l + r)
>>1;
if(l <= mid) update (i<<
1,l,mid,l,r);if
(r > mid) update (i<<1|
1,mid+
1,r,l,r)
;push_up
(i);
}void update2 (
int x,
int y)
if(deep[x]
> deep[y]
)swap
(x,y)
;update(1
,1, n, dfn[x]
, dfn[y]);
}int
main
(void
)for
(int i =
1; i <= n ; i ++)if
(deg[i]==1
) value[i]=1
, sum ++
;for
(int i =
1; i <= n ; i ++)if
(sz(edge[i]))
dfs1 (rt)
, dfs2 (rt, rt)
, build (1,
1,n)
; vector <
int> ve;
while
(q --)if
(now %
2) cout <<-1
<< endl;
else cout << n + x -
2+ tr[1]
.v0 << endl;
for(
auto it : ve)
}}
複習計畫 主席樹
三類經典應用 一.區間mex 解題思路 對於主席樹,我們維護一顆權值線段樹,並且用來記錄每乙個數最後出現的位置。為什麼這樣做呢?例如現在有序列 3,1,0,2,3,1,0,2,3,1,0 2,那麼對於主席數來說我們維護 1,4 1,4 1,4 的序列,主席樹內容為 3,2,4,1,0,0 3,2,4...
樹鏈剖分 樹鏈剖分講解
好了,這樣我們就成功解決了對樹上修改查詢邊權或點的問題。下面放上 vector v maxn int size maxn dep maxn val maxn id maxn hson maxn top maxn fa maxn 定義 int edge 1,num 1 struct tree e ma...
網路流複習計畫
既然是複習網路流,那就不會去做水題了吧233 a.bzoj3996 tjoi2015線性代數 看到題就被嚇壞了2333。線性代數根本沒看完好嗎?然後。md轉個模型就是網路流了 題目大意 給定乙個n n 的矩陣b 和乙個1 n 的行向量c 求乙個1 n 的01矩陣a 使 a b c at 最大 a b...