[JZOJ3385] 黑魔法师之门题解

题目描述

经过了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

样例解释:

第三次添加之后,存在一个满足条件的子图 {1, 2, 3}(其中1, 2, 3是数据中边的标号)。

第四次添加之后,存在三个子图 {1, 2, 3},{1, 2, 4},{3, 4}。

子图不一定连通。举另外一个例子,例如点(1、2、3),(4、5、6)分别组成一个三元环,则图中有三个所求子图。

 
数据范围限制

对于30% 的数据,N, M≤10。

对于100% 的数据,N≤200000,M≤300000。

代码见下

首先,我们认为,没有点时也有一个。

可以发现,满足条件的图为多环合成。

然后,若两个不同块连点,则无法贡献,若同一连通块,则多一环,乘二,输出减一即可。

代码见下

#include<bits/stdc++.h>
using namespace std;
long long n,m,a,b,mod=1000000009,f[200005],f2[200005],f3[200005],f4[200005],lk=0;
long long find(long long a1){
	//cout<<a1<<endl;
	if(a1==f[a1]){
		return a1;
	}
	else{
		f[a1]=find(f[a1]);
		return f[a1];
	} 
}
map<pair<long long,long long>,long long> mp;
int main(){
	//freopen("")
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		f[i]=i;
	}
	lk=1;
	for(int i=1;i<=m;i++){
		cin>>a>>b;
		//mp[{a,b}]++;
		if(find(a)!=find(b)){
			f[find(b)]=find(a);	
		}
		else{
			lk*=2;
			lk%=mod;
		}	
		cout<<lk-1<<endl;
	}
	return 0;
}

posted @ 2025-10-05 19:41  bz02_2023f2  阅读(7)  评论(0)    收藏  举报  来源