最大Xor路徑 7 30 T2

2021-07-15 22:42:49 字數 1967 閱讀 9338

題目描述

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 的路徑不用...