洛谷P4494 反色遊戲

2022-06-13 13:42:13 字數 1529 閱讀 5600

小\(c\)和小\(g\)經常在一起研究搏弈論問題,有一天他們想到了這樣乙個遊戲.

有乙個\(n\)個點\(m\)條邊的無向圖,初始時每個節點有乙個顏色,要麼是黑色,要麼是白色.現在他們對於每條邊做出一次抉擇:要麼將這條邊連線的兩個節點都反色(黑變白,白變黑),要麼不作處理.他們想把所有節點都變為白色,他們想知道在\(2^m\)種決策中,有多少種方案能達成這個目標.

小\(g\)認為這個問題太水了,於是他還想知道,對於第\(i\)個點,在刪去這個點及與它相連的邊後,新的答案是多少.

由於答案可能很大,你只需要輸出答案對\(10^9+7\)取模後的結果.

\(q\leq 5,n,m\leq 10^5\)。

考慮對於乙個連通塊,如果其黑色節點數量為奇數,那麼顯然無解。否則一定有解,只需要將黑點兩兩匹配,對於匹配的兩個黑點,我們將他們之間的邊全部反色(開始全部邊設為白色),最後將黑色的邊所連線的兩個點反過來即可。

考慮對於乙個連通塊的任意一棵生成樹,點兩兩之間有且僅有一條路徑,所以如果這個連通塊只是一棵樹的話,那麼只有一種反色方案。否則設這個連通塊的點數為 \(n'\),邊數為 \(m'\),剩餘 \(m-n+1\) 條邊可以任意選擇,方案數就是 \(2^\)。假設有 \(cnt\) 個連通塊且每個連通塊內黑點數量均為偶數,那麼總方案數就是 \(2^\)。

接下來處理刪去乙個點的操作。設 \(sum\) 為黑點數量為奇數的連通塊數量,\(bel_x\) 表示 \(x\) 所在連通塊,\(s_i\) 表示連通塊 \(i\) 的黑色點奇偶性。顯然 \(sum\geq 2\) 無解。否則分類討論:

時間複雜度 \(o(q(n+m))\)。

#include using namespace std;

typedef long long ll;

const int n=100010,mod=1e9+7;

int q,n,m,cnt,sum,tot,head[n],col[n],dfn[n],low[n],bel[n],pw[n],deg[n];

bool flag[n],s[n];

struct edge

e[n*2];

void add(int from,int to)

; head[from]=tot;

}void prework()

void tarjan(int x,int rt)

} else low[x]=min(low[x],dfn[v]); }}

int main()

if (!sum) printf("%d ",pw[m-n+cnt]);

else printf("0 ");

for (int i=1;i<=n;i++)

else

c++;}}

if (!ok || s[bel[i]]!=col[i]) printf("0 ");

else printf("%d ",pw[(m-deg[i])-(n-1)+(cnt+c-(i==bel[i]))]);

}} printf("\n");

} return 0;

}

洛谷 P1558 色板遊戲

阿寶上學了,今天老師拿來了一塊很長的塗色板。色板長度為l,l是乙個正整數,所以我們可以均勻地將它劃分成l塊1厘公尺長的小方格。並從左到右標記為1,2,l。現在色板上只有乙個顏色,老師告訴阿寶在色板上只能做兩件事 1.c a b c 指在a到 b 號方格中塗上顏色 c。2.p a b 指老師的提問 a...

洛谷P1558 色板遊戲

阿寶上學了,今天老師拿來了一塊很長的塗色板。色板長度為l,l是乙個正整數,所以我們可以均勻地將它劃分成l塊1厘公尺長的小方格。並從左到右標記為1,2,l。現在色板上只有乙個顏色,老師告訴阿寶在色板上只能做兩件事 1.c a b c 指在a到 b 號方格中塗上顏色 c。2.p a b 指老師的提問 a...

洛谷P1558 色板遊戲

阿寶上學了,今天老師拿來了一塊很長的塗色板。色板長度為 l l 是乙個正整數,所以我們可以均勻地將它劃分成 l 塊 1 厘公尺長的小方格。並從左到右標記為 1,2,l 現在色板上只有乙個顏色,老師告訴阿寶在色板上只能做兩件事 c a b c 指在 a 到 b 號方格中塗上顏色 c p a b 指老師...