并查集
黑魔法师之门 |
试题描述 |
经过了16 个工作日的紧张忙碌,未来的人类终于收集到了足够的能源。然而在与Violet星球的战争中,由于Z 副官的愚蠢,地球的领袖applepi 被邪恶的黑魔法师Vani 囚禁在了Violet 星球。为了重启Nescafé这一宏伟的科技工程,人类派出了一支由XLk、Poet_shy 和lydrainbowcat 三人组成的精英队伍,穿越时空隧道,去往Violet 星球拯救领袖applepi。applepi 被囚禁的地点只有一扇门,当地人称它为“黑魔法师之门”。这扇门上画着一张无向无权图,而打开这扇门的密就是图中每个点的度数大于零且都是偶数的子图的个数对1000000009 取模的值。此处子图 (V, E) 定义为:点集V 和边集E 都是原图的任意子集,其中E 中的边的端点都在V 中。但是Vani 认为这样的密码过于简单,因此门上的图是动态的。起初图中只有N 个顶点而没有边。Vani 建造的门控系统共操作M 次,每次往图中添加一条边。你必须在每次操作后都填写正确的密码,才能够打开黑魔法师的牢狱,去拯救伟大的领袖applepi。 |
输入 |
第一行包含两个整数 N 和 M。接下来 M 行,每行两个整数 A 和 B,代表门控系统添加了一条无向边(A, B)。 |
输出 |
一共 M 行,表示每次操作后的密码。 |
输入示例 |
4 8 3 1 3 2 2 1 2 1 1 3 1 4 2 4 2 3 |
输出示例 |
0 0 1 3 7 7 15 31 |
其他说明 |
数据范围: N≤200000 ,M≤300000 。 |
1 #include<iostream> 2 #define p 1000000009 3 using namespace std; 4 int read() 5 { 6 int f=0; 7 char x;x=getchar(); 8 while(x<‘0‘||x>‘9‘) x=getchar(); 9 while(x>=‘0‘&&x<=‘9‘) 10 { 11 f=f*10+x-‘0‘; 12 x=getchar(); 13 } 14 return f; 15 } 16 int fa[200001]; 17 int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);} 18 int main() 19 { 20 int n,m; 21 int ans=1; 22 n=read(),m=read(); 23 for(int i=1;i<=n;i++) fa[i]=i; 24 for(int i=1;i<=m;i++) 25 { 26 int a,b; 27 a=read(),b=read(); 28 int a1=find(a),b1=find(b); 29 if(a1==b1) ans*=2; 30 else fa[a1]=fa[b]; 31 printf("%d\n",(ans-1)%p); 32 ans%=p; 33 } 34 }
时间: 2024-10-18 01:08:55