NKOI 1873 COW XOR奶牛異或

2021-07-11 14:33:19 字數 1653 閱讀 5979

cow xor奶牛異或

time limit:10000ms  memory limit:65536k

total submit:138 accepted:56 

case time limit:500ms

description

農民約翰在餵奶牛的時候被另乙個問題卡住了。他的所有n(1 <= n <= 100,000)個奶牛在他面前排成一行(按序號1..n的順序),按照它們的社會等級排序。奶牛#1有最高的社會等級,奶牛#n最低。每個奶牛同時被指定了乙個不唯一的附加值,這個數在0..2^21 - 1的範圍內。 

幫助農民約翰找出應該從哪一頭奶牛開始喂,使得從這頭奶牛開始的乙個連續的子串行上,奶牛的附加值的異或最大。 

如果有多個這樣的子串行,選擇結尾的奶牛社會等級最高的。如果還不唯一,選擇最短的。

input

第1行:乙個單獨的整數n。 

第2到n + 1行:n個0..2^21 - 1之間的整數,代表每頭奶牛的被賦予的數。第j行描述了社會等級j - 1的奶牛。

output

第 1 行: 3個空格隔開的整數,分別為:最大的異或值,序列的起始位置、終止位置。 時限0.5秒

sample input

510

542

sample output

6 4 5

hint

最大異或值為6,從第4個開始喂,到第5個結束。 

4 異或 2 = 6 

(100) 異或 (010) = (110)

source

【usaco6.1.3】

由於異或運算與加法運算類似,都可以用字首儲存,想到用字首異或優化,即f[i]=a[1]^a[2]^……^a[i].

分析:j從1到n依次列舉每個數字,a[j]與哪乙個a[i]異或的值最大呢?(1<=i<=j-1)

把a[1]到a[j-1]按二進位制位插入到trie中,最高位與根相連,最低位為葉子節點。

原本應該讓a[j]與a[1]到a[j-1]依次取異或,時間複雜度太高,不可取。

考慮用貪心的方法,讓異或後的高位盡可能為1,所以在查詢trie時,

盡量選讓高位異或結果為1的路線,實在不行才選為0的路線往葉子節點走。

每次查詢的時間複雜度為o(20) 

#include#includeconst int m=20;

int n;

int f[200005];

struct nodetrie[2000005];

int tot=1;

void insert(int k)

trie[t].num=k;

}int find(int k)

return trie[t].num;

} int main()

int ans=f[1];

insert(1);

for(i=2;i<=n;i++)

insert(i);

}printf("%d %d %d",ans,s,t);

}

NKOI 防守馬克

題目略 我最早其實想的貪心,力量從大到小,從下到上放置奶牛,但是如果有乙隻力量小的奶牛非常重,就矛盾。狀壓dp基礎題,但是開始我一直沒有想到運用列舉頂端的奶牛進行狀態轉移。我發現其實題目中物件增長的方式可以給狀態轉移帶來啟發,比如這裡的奶牛就是乙隻只疊上去的嘛。另外我還發現其實驗證dp是否可行就是看...

NKOI 1349 工作安排

uasco 2009 open gold 2 工作安排 time limit 10000ms memory limit 65536k total submit 63 accepted 43 case time limit 1000ms description farmer john 有太多的工作要做...

NKOI 3645 黑盒序列

黑盒序列 time limit 10000ms memory limit 65536k total submit 4 accepted 4 case time limit 1000ms description 有乙個只能存放整數的序列叫 黑盒序列 一開始序列為空。對於該序列,我們有add和get兩種...