題目描述
mt神牛非常喜歡出xor的題,在wc2011的時候,mt神牛出了一道非常經典的xor最大路徑題。
bird向mt神牛學習,思考了許多關於xor路徑的問題,有一天,bird想到了乙個問題,給出乙個序列,求這個序列的連續子串行的xor值最大。
如1 3 4 8,最大的xor子串行當然是3 xor 4 xor 8=15了。
bird實在太強大了,這個問題怎麼能難住他呢?於是bird又開始思考了,如果是一顆樹呢,如何求出這棵帶邊權的樹的一條最大xor路徑呢?但是誰都知道bird實在太強大了,馬上想到了解決這個問題的高效演算法,但是bird總是不願去機房寫**,於是他把這個easy的問題,交給了你,希望你能盡快幫他寫完**。
輸入 第一行,乙個整數n,表示一顆樹有n個節點,接下來n-1行,每行三個整數a,b,c表示節點a和節點b之間有條權值為c的邊
輸出 輸出僅一行,即所求的帶邊權樹的xor最大路徑。
樣例輸入
4 1 2 3
1 3 4
1 4 7
樣例輸出
7提示
【資料規模】
對於40%的資料,資料退化為一條鏈
除上述的40%的資料外,還有10%的資料n<=1000
100%的資料滿足2<=n<=100000, 1 < a,b<=n,c<=2^31-1
我們先考慮是一條鏈的情況:用f
[i]表
示前i個
點的異或
和,則類
似於字首
和,i到
j(i的異或和
為f[j
]xor
f[i]
,所以對
於鏈的情
況答案為
maxf
[i]x
orf[
j]1<=i,
j<=n.
然後我們考慮是樹的情況:
類似於鏈,我們用f[i]表示根節點到i的異或和,顯然i->j路徑的異或和等價於f[i] xor f[j],這與鏈的情況無異。
所以題目就可以轉化為給定n個數,求出這n個數中任意兩個數xor的最大值。
具體做法:
在二進位制中,越高位有1值越大,而異或運算只影響到當前位,所以越高位能異或成1就把它異或成1,於是我們將所有f[i]轉為二進位制當做字串,按從高位到低位的順序存入一顆字典樹中,然後從最高位開始列舉,設當前數為x,當前列舉到二進位制中第i位,x的第i位數字為j,當前在字典樹中的k號節點,若k節點的j xor 1兒子存在,則當前答案的第i位為1,否則為0。時間複雜度(n*900)。
#include
#include
#include
#include
#define ll long long
using
namespace
std;
int n,x,y,z,tot,ans;
int a[35],head[100005],next[200005],to[200005],len[200005],f[100005];
struct ty
}p[3100005];
void dfs(int k,int pre)
}void add(int x,int y,int z)
void work(int x)
for(int i=k+1;i<=31;i++) a[i]=0;
}void update()
x=p[x].next[j];
}}int query()
return s;
}
int main()
dfs(1,0);
p[0].init();
for(int i=1;i<=n;i++)
for(int i=1;i<=n;i++)
cout
0;}
WC2011 最大XOR和路徑
wc2011 最大xor和路徑 本題關鍵是抓住xor的性質 a b a b 異或兩次等於0 1到n,一定是走一條路,可能再往別處走出環 每個環都可以 獨立 走出來 1到n的路徑,可以拆成任意一條路和若干個環拼成的 dfs找環,加入線性基 能變大就異或上去。o m 64 include define ...
WC 2011 最大Xor和路徑
給你一張n個點,m條邊的無向圖,每條邊都有乙個權值,求 1到n的路徑權值和的最大值。任意一條路徑都能夠由一條簡單路徑 任意一條 在接上若干個環構成 如果不與這條簡單路徑相連就走過去再走回來 那麼在對這些環進行分類 1 直接與簡單路徑相連 相交的重複部分不算就可以了。2 不與簡單路徑相連 我們需要跑過...
WC2011 最大XOR和路徑 題解
首先看到題面,最大 異或 聯想到了什麼?沒錯,線性基。不會的同學請先學習 線性基。但是這道題,因為是在圖里,所以不能直接簡單地用線性基求解。觀察題目中的圖,我們可以發現 嗎?答案一定是由從 1 到 n 的一條路徑上的異或和以及若干環上的異或和構成的。首先我們要理清乙個問題 從 1 到 n 的路徑不用...