2016北京集訓測試賽1 奇怪的樹 樹鏈剖分

2022-05-03 18:30:08 字數 2115 閱讀 4528

對於操作1,不論選了哪個點為a,最後反轉顏色的點集都只有兩種型別(顯然啦)。

暴力解法:對每個操作3,從a向上直到根節點,每到乙個節點記錄(它父親的黑點數減去自己的黑點數)*父親節點的編號。另外,還要記錄a子樹內的黑點。。

這種o(n2)的做法肯定會爆,考慮優化。由於這是一棵靜態樹,考慮樹鏈剖分。

需要記錄乙個陣列re[x][0/1][0/1]。第2維表示深度的奇偶,第3維表示點的顏色。例如:re[x][0][0]記錄的是初始情況下以x為根的子樹中深度為偶數的點有多少個為白色。

為了能夠順利剖分,需要記錄乙個num[0/1][0/1],它是樹狀陣列,同樣一維為深度,一維為顏色。num[0][0].tree[dfn[x]](這裡的tree[dfn[x]]是單純這個節點的值而不是該點所表示區間的值)

表示的是(除了x的重兒子外其他孩子子樹中深度為偶數的點為白色的個數)*x。(在計算途中,假如有操作1,則num[0][0]或者num[1][0]的定義可能會改變,即num[0/1][0]最後一維的定義可能由白色變為黑色,需要開乙個陣列flag[2]記錄)

最後,我們還需要乙個樹狀陣列sum[0/1][0/1],兩維所表示意義同上。它記錄單獨某個點的顏色。那知道了某個點x在dfs2中的dfn(也可以把它理解為in)和out後,就可以用sum查詢x點子樹內有多少個深度為奇(偶)的點顏色為白(黑)。(ps:當有操作1時sum的定義也可能改變,num和sum的定義是一起變的,所以只開乙個陣列flag記錄就好)

#include#include

#include

#include

using

namespace

std;

const

long

long maxn=200100;

struct ddg[

2*maxn];

long

long

m;long

long re[maxn][2][2

],h[maxn],size[maxn],tot,jsq,n,val[maxn];

long

long

fa[maxn],son[maxn],dep[maxn],top[maxn];

long

long

out[maxn],dfn[maxn];bool flag[2

];struct

tree

inline

void add(long

long x,long

long

k)

inline

long

long find(long

long

x)

inline

long

long query(long

long l,long

long

r)

}sum[

2][2],num[2][2

];void dfs1(long

long x,long

long

fa1)

son[x]=id;

}void dfs2(long

long x,long

long

u)

out[x]=jsq;

for (long

long i=0;i<=1;i++)

for (long

long j=0;j<=1;j++) num[i][j].add(dfn[x],(re[x][i][j]-re[son[x]][i][j])*x);

}int

main()

dfs1(

1,0);dfs2(1,1

); flag[

0]=flag[1]=false

;

for (long

long i=1;i<=m;i++)

if (t==3

)

printf(

"%lld\n

",ans);}}

}

集訓Day1 測試 奇怪數

奇怪數 odometer 題目描述 乙個正整數z是奇怪數,當且僅當滿足的條件是 z的所有數字中,只有乙個數字不同於其他數字。例如 33323 110 都是奇怪數,而 9779 5555 都不是奇怪數。給出兩個正整數 x 和 y,滿足 100 x y 10 16,請問區間 x,y 內有多少個奇怪數?輸...

2023年暑假集訓周賽 1題解

周賽鏈結 problem a 題目大意 給出n個數,然後q個詢問,每次詢問輸入乙個數字,輸出n個數裡面有多少個數小於等於它 總的減去大於這個數的 思路 先排序,然後用upper bound返回大於的第一元素 include include includeusing namespace std int...

2019北京集訓測試賽(十三) 函樹 虛樹

題目大意 給你一顆 n 個節點的樹,定義 d x,y 點 x 到點 y 最短路上經過的邊數。求 sum limits sum limits varphi i times j times d i,j 答案對998244353 取模。我們對這個式子做一些細微的處理,設最終的答案為 ans ans sum...