牛客練習賽37 C(雙向dfs 字典樹)

2021-09-27 02:00:43 字數 1856 閱讀 2375

題意:給定乙個n*n(n

<=20

n<=20

n<=2

0)大小的矩陣,矩陣中的每個點上有乙個數字,初始時,你自身有乙個數字,現在讓你從(1,1)走到(n,n),每次只能向下或向右走,將路徑上的數字以及你自身的數字異或起來,問最小的異或值為多少。

首先考慮資料最值,直接大力搜尋的話複雜度為c

4020

c_^c4

020​

,複雜度很高。

所以我們可以將路徑拆為從(1,1)走20步到(x,y),再從(x,y)走20步道(n,n),這兩個分開計算複雜度為:2∗c

2010

2*c_^

2∗c201

0​,路徑計算最大異或和的話,就需要用到字典樹,我們枚舉行號,建立字典樹,計算答案即可。

#include

using

namespace std;

typedef

long

long ll;

const

int maxn=

6e6+7;

#define int long long

int trie[maxn][2

];int tot=1;

void

insert

(int x)

}int

myfind

(int x)

return res;

}void

init()

int n;

int a[29]

[29];

intgetid

(int x,

int y)

vector<

int> v1[29]

,v2[29]

;bool

check

(int x,

int y)

int e;

void

dfs1

(int x,

int y,

int step,

int val)if(

check

(x,y+1)

)dfs1

(x,y+

1,step+

1,val^a[x]

[y+1])

;if(check

(x+1

,y))

dfs1

(x+1

,y,step+

1,val^a[x+1]

[y]);}

void

dfs2

(int x,

int y,

int step,

int val)if(

check

(x-1

,y))

dfs2

(x-1

,y,step+

1,val^a[x-1]

[y]);if

(check

(x,y-1)

)dfs2

(x,y-

1,step+

1,val^a[x]

[y-1])

;}signed

main()

dfs1(1

,1,1

,a[1][

1]);

dfs2

(n,n,

1,a[n]

[n])

;int maxx=0;

for(

int i=

1;i<=n;

++i)

printf

("%lld\n"

,maxx)

;return0;

}

牛客練習賽37 C題筱瑪的迷陣探險

牛客練習賽37 c題筱瑪的迷陣探險 ps 需要前置技能 dfs和字典樹 二分dfs 分別從 1,1 和 n,n 開始走n步,會發現無論如何走最後都會到達對角線上 找出對角線上對應的每個可能結果,開倆個陣列,分別存在倆個陣列中,在對應的點上的集合上,乙個插入到字典樹中,另乙個查詢和它異或最大的數。in...

牛客練習賽9

時間限制 c c 1秒,其他語言2秒 空間限制 c c 32768k,其他語言65536k 64bit io format lld 珂朵莉想每天都給威廉送禮物,於是她準備了n個自己的本子 她想送最多的天數,使得每天至少送乙個本子,但是相鄰兩天送的本子個數不能相同 珂朵莉最多送幾天禮物呢 第一行乙個整...

牛客練習賽15

時間限制 c c 2秒,其他語言4秒 空間限制 c c 262144k,其他語言524288k 64bit io format lld 第一次期中考終於結束啦!沃老師是個語文老師,他在評學生的作文成績時,給每位學生的分數都是乙個小於10的非負小數。amy 8.99999999999999999999...