首先轉化一波:
對於1操作,我們求原圖的生成樹,然後對於每條非樹邊記下它和樹邊形成的環,這樣的操作共有 $m-n+1$ 個;
對於2操作,我們考慮對於 $n$ 個結點,把和這個結點相連的邊狀態反轉。
不難發現任何操作序列都可以拆成這 $m+1$ 個操作,且顯然每個操作最多進行一次,所以只用考慮這 $m+1$ 個操作就可以了。
直接跑異或方程組消元就可以做到 $o(\frac)$。
怎麼優化呢?手玩一下可以發現:如果和每個點相連的堵塞邊條數都是偶數,那麼一定有解(證明可以看官方題解
反正我也不會證)
而1操作是不會改變這個值的奇偶性的,因此只用考慮2操作,複雜度下降為 $o(\frac)$。
乙個簡單的 trick:跑高斯消元的時候把所有全零式子扔到最後,那麼判有解/無解只要檢查最後的式子即可。
#include#includeview code#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;
}
uoj 513 UR 19 清掃銀河
很簽到題 操作2先假設全部為黑,那麼變成了每選乙個點便會取反相連的邊 如果能暴力搞出所有環就可以高斯消元判斷,也許能過40 對原圖建dfs樹,發現只需要保留返祖邊加上對應路徑的環即可,任何的環都可以通過這些環異或得到,於是環的個數變為m級別,高斯消元o m 3 可以70 設返祖邊 u,v,w 的選擇...