1. 程式人生 > >黑魔法師之門 C組模擬賽

黑魔法師之門 C組模擬賽

題目大意

每次加1條邊(共N次),每次詢問每個點的度數大於零且都是偶數的子圖的個數對1000000009取模的值.

解題思路:

並查集
每次讀入的兩個點如果父親相同就說明這兩個點的度數大於零且都是偶數的子圖。
我們又可以發現,每次(ans初值為1)ans*2-1便是答案,但是ans不能-1,減一就錯了…

源程式:

#include<cstdio>
#include<cctype>
#define maxn 200001
#define mod 1000000009
using namespace std;
int fa[maxn],n,m,ans=1;
inline int find(int
x){return fa[x]!=x?fa[x]=find(fa[x]):x;} inline int read(){ int d=0,f=1;char c=getchar(); while (!isdigit(c)){if (c=='-') f=-1;c=getchar();} while (isdigit(c)) {d=d*10+(int)c-48;c=getchar();} return d; } void write(int x) {if (x>9) write(x/10);putchar(x%10+48);return;} int main(){ scanf
("%d%d",&n,&m); for(int i=1;i<=n;i++)fa[i]=i; for(int i=1;i<=m;i++) { int a=read(),b=read(); int af=find(a),bf=find(b); if(af==bf) ans*=2; else fa[af]=bf; ans%=mod; write(ans-1);putchar(10); } }