BZOJ-2115-Xor-WC2011
生活随笔
收集整理的這篇文章主要介紹了
BZOJ-2115-Xor-WC2011
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
描述
分析
- 我把文庫里的粘了過來.
只知道點1到點N的一條路徑和圖中若干個環,就能通過異或,表示成所有路徑。那么,需要多少環才能保證必定能表示成所有路徑呢?其實,并不需要很多, 因為一些環可以通過其他的環異或得到,只需保證環是相互 獨立的,兩兩之間存在著不同的邊(乘數)。構建一棵生成樹,統計非樹邊與生成樹形成的環即可,最多只有M-N+1個環。可用dfs實現,時間復雜度為O(M)。
結合上述性質,可以設計貪心說法:將x表示成二進制數,從高位到低位枚舉,當前位能取1則取1。
- 從高位到低位枚舉當前位;
- 在a數組中選取一個當前位為1的數a[i],假如不存在a[i],則轉1);
- 假如x的當前位為0,則x=x xor a[i];
- 將a數組中所有當前位為1的數a[j]與a[i]異或,a[j]=a[j] xor a[i], 轉1)。
最終x保證必定是最大的,時間復雜度為O (NB)。(N為a數組的大小,B為二進制位數)
- 看了上面的解析就去打了, 結果好幾次都 WA. 然后跟HZWER的代碼對比, 發現他在步驟2中選過的元素在后面再進行步驟2時不去考慮了.
- 資料里怎么沒說…
改了這個地方就對了
1直接左移62位是會報錯的. 但一次一次來就沒事…
- 這個題到底和高斯消元和線性基的關系在哪?
- 貪心的那四步其實就是標準的用高斯消元解異或方程組的步驟. 我后來更新了代碼片.
- 解得的那些解就是線性基. 用它們直接異或就可以表示出所有原來a數組可以異或出的結果.
代碼
https://code.csdn.net/snippets/619907
- 首頁: http://blog.csdn.net/qq_21110267
總結
以上是生活随笔為你收集整理的BZOJ-2115-Xor-WC2011的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BestCoder-Round#33
- 下一篇: BZOJ-1007-水平可见直线-HN2