UOJ513 清掃銀河(高斯消元)

2022-08-21 04:45:20 字數 847 閱讀 8803

首先轉化一波:

對於1操作,我們求原圖的生成樹,然後對於每條非樹邊記下它和樹邊形成的環,這樣的操作共有 $m-n+1$ 個;

對於2操作,我們考慮對於 $n$ 個結點,把和這個結點相連的邊狀態反轉。

不難發現任何操作序列都可以拆成這 $m+1$ 個操作,且顯然每個操作最多進行一次,所以只用考慮這 $m+1$ 個操作就可以了。

直接跑異或方程組消元就可以做到 $o(\frac)$。

怎麼優化呢?手玩一下可以發現:如果和每個點相連的堵塞邊條數都是偶數,那麼一定有解(證明可以看官方題解

反正我也不會證)

而1操作是不會改變這個值的奇偶性的,因此只用考慮2操作,複雜度下降為 $o(\frac)$。

乙個簡單的 trick:跑高斯消元的時候把所有全零式子扔到最後,那麼判有解/無解只要檢查最後的式子即可。

#include#include

#include

#define for(i,a,b) for(i=(a);i<=(b);++i)

using

namespace

std;

const

int n=305

;bool

s[n];

bitset

a[n];

intmain()

}cur=1

; for(i,

1,n)

ok=1

; for(i,cur,n)

if(a[i][0])

puts(ok?"

yes":"no"

); }

return0;

}

view code

uoj 513 UR 19 清掃銀河

很簽到題 操作2先假設全部為黑,那麼變成了每選乙個點便會取反相連的邊 如果能暴力搞出所有環就可以高斯消元判斷,也許能過40 對原圖建dfs樹,發現只需要保留返祖邊加上對應路徑的環即可,任何的環都可以通過這些環異或得到,於是環的個數變為m級別,高斯消元o m 3 可以70 設返祖邊 u,v,w 的選擇...