傳送門
題意:給定n
nn個結點的權值ai∈
[1
,127
]a_i\in[1,127]
ai∈[1
,127
].求最大異或和生成樹。
思路:答案的範圍為[0,
127]
[0,127]
[0,127
].考慮樹形dpdp
dp, 設dp[
i][j
]dp[i][j]
dp[i][
j]為以結點i
ii為根的子樹答案是否為jjj
對於當前結點u
uu,遍歷所有的子結點v
vv ,有轉移方程:dp[
u][i
⊕j]∣
=dp[
u][i
]&dp
[v][
j]
dp[u][i\oplus j]\ |=dp[u][i]\&dp[v][j]
dp[u][
i⊕j]
∣=dp
[u][
i]&d
p[v]
[j].
因為是從上往下遍歷,所以顯然這樣dpdp
dp思路是正確的。一開始先初始化一波dp[
i][a
[i]]
=1
dp[i][a[i]]=1
dp[i][
a[i]
]=1然後dfs
dfsdf
s一遍即可。
時間複雜度:o(12
72n)
o(127^2n)
o(1272
n)
#include
using
namespace std;
typedef
long
long ll;
const
int n=
1e2+10;
#define mst(a) memset(a,0,sizeof a)
int n,ans,a[n]
;bool jg[n]
,dp[n]
[128];
vector<
int>e[n]
;void
dfs(
int u,
int fa)}}
intmain()
for(
int i=
1,u,v;i)dfs(1
,0);
printf
("%d\n"
,ans)
;return0;
}
異或的路徑 樹形DP
給一棵 n 個點的樹,1 號節點為根,邊有邊權,令 f u,v 表示 u 節點到 v 節點,路徑上邊權異或值。求 i 1n j 1nf i,j sum sum f i,j i 1n j 1n f i,j 結果對 1000000007 取模。第一行乙個整數 n n 100000 n n leq 100...
樹dp 統計異或值
給定一棵n個點的樹,每個點有權值 定義表示 到的最短路徑上,所有點的點權異或和。對於,求所有 的異或和。第一行乙個整數n。接下來n 1行,每行2個整數u,v,表示u,v之間有一條邊。第n 1行有n個整數,表示每個點的權值 輸出乙個整數,表示所有 的異或和,其中 示例1 複製4 1 21 3 1 41...
異或最小生成樹
對於n個點的完全圖,每兩個點之間的距離等於兩點的權值的異或和,求最小生成樹 int n struct xortrie void insert ll x,int id val rt x ll answerpos int rt,int pos,ll x return rt void traceback ...