題目傳送門
給出乙個 \(n\) 個點 \(m\) 條無向邊的圖,每個點都有乙個 \(\in [0,1]\) 的權值,每次可以選擇一條邊,然後將該邊相連兩點權值異或上 \(1\)。問有多少種選擇方法使得每個點的權值都變為 \(0\)。(每條邊只能選擇一次)
但是這個問題太簡單了,所以你要求刪掉每個點以及它連出的邊之後的答案。
有 \(t\) 組資料,\(t\le 5,n,m\le 10^5\)。
這道題不是很難寫,但是很難想。
我們先考慮一棵樹的答案,你發現這樣方案是唯一的,因為你從葉子節點開始考慮,如果當前點是黑的,那就選擇父親邊,否則就不能選。然後你發現有解的充要條件就是黑點是偶數個。
考慮乙個 \(n\) 點 \(m\) 邊的連通圖,你發現如果我們欽點出 \(n-1\) 條邊作為樹邊,那麼它們是惟一的。對於剩下的 \(m-n+1\) 條邊,你可以任意選擇要或不要(相當於改變兩個點的初始顏色),然後改變那 \(n-1\) 條邊使得合法即可。所以答案就是 \(2^\) ,判斷有解的方法同上。
對於乙個不連通圖,你發現如果有解的話答案就是 \(2^\)。其中 \(t\) 是連通塊個數。顯然。
考慮刪掉乙個點以及相連的邊後的方案數,實際上就是如何判斷合不合法以及刪掉之後的連通塊個數。
你發現這個東西只跟割邊有關,設 \(\text(i)\) 表示點 \(i\) 在 \(\text\) 樹上與兒子節點相連的割邊個數,你發現答案連通塊個數就增加了 \(\text(i)\) 個。(如果 \(i=\text\) 的話 \(\text(i)\) 需要減 \(1\) 因為它連通塊增加個數會少乙個,因為它沒有父親)
首先需要判斷除了該點所屬外的連通塊的合法性。
然後判斷分出來的子樹合法性。
然後判斷剩下的一塊合法性就好了。
合法性判斷同上文,看連通塊裡面 \(1\) 的個數就好了。
用 \(\text\) 實現,時間複雜度 \(\theta(tn)\)。
#include using namespace std;
#define int register int
#define mod 1000000007
#define maxn 100005
template inline void read (t &t)while (c >= '0' && c <= '9') t *= f;}
template inline void read (t &t,args&... args)
template inline void write (t x)if (x > 9) write (x / 10);putchar (x % 10 + '0');}
vector g[maxn];
int n,m,rt,ind,a[maxn],f[maxn],d[maxn],bin[maxn],dfn[maxn],low[maxn],deg[maxn],cnt[maxn],bel[maxn],sum[maxn];
void link (int x,int y)
void tarjan (int u)
else low[u] = min (low[u],dfn[v]);
} cnt[u] -= (u == rt);
} signed main()
putchar ('\n'),ind = 0;
for (int i = 1;i <= n;++ i) g[i].clear (),f[i] = d[i] = cnt[i] = deg[i] = dfn[i] = low[i] = 0;
} return 0;
}
HAOI2018 反色遊戲
小c和小g經常在一起研究搏弈論問題,有一天他們想到了這樣乙個遊戲 有乙個 n nn 個點 m mm 條邊的無向圖,初始時每個節點有乙個顏色,要麼是黑色,要麼是白色 現在他們對於每條邊做出一次抉擇 要麼將這條邊連線的兩個節點都反色 黑變白,白變黑 要麼不作處理 他們想把所有節點都變為白色,他們想知道在...
HAOI2018 簡要題解
以前做過的 haoi2018 染色 haoi2018 蘋果樹暫時不更 haoi2018 字串覆蓋 已經棄療了。總體難度 medium 偏 easy,但是 luogu4495 haoi2018 奇怪的揹包 想不到是真的腦抽。可以在 找到。小 c 和小 g 經常在一起研究搏弈論問題,有一天他們想到了這樣...
HAOI 2018 染色(容斥 NTT)
設 f k 為強制選擇 k 個顏色出現 s 種,其餘任取的方案數。則有 f k m k 不難看出,這個方案可能包括了超過 k 種顏色,也有重複的方案,所以恰有 k 個顏色出現 s 種的方案 ans k 滿足 ans k sum 1 f i 最終化簡得到 ans k sum i f i cdot ov...