黑魔法师之门 (magician)-并查集
题目
经过了 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
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<fstream>
#include<set>
#define ll long long
using namespace std;
int read(){
int res=,f=;
char ch;
ch=getchar();
while(ch<''||ch>''){
if(ch=='-')f=-;
ch=getchar();
}
while(ch>=''&&ch<=''){
res=res*+(ch-'');
ch=getchar();
}
return res*f;
}
const int MAXN=;
const ll mod=;
int n,m;
set<int> u[MAXN];
ll ans;
int main(){
n=read();m=read();
for(int i=;i<=n;++i)u[i].insert(i);
for(int i=;i<=m;++i){
int c,b;
b=read();
c=read();
int fl=;
for(set<int>::iterator iter=u[b].begin();iter!=u[b].end();++iter){
int p=*iter;
if(u[c].count(p)){
fl=;
break;
}
}
u[b].insert(c);u[c].insert(b);
if(fl)ans=ans*+;
printf("%lld\n",ans);
}
fclose(stdin);
fclose(stdout);
return ;
}
不过这段代码的速度与正确性都难以保证,毕竟一个环也是满足提议的,也就是说还要将能找到的更新一遍。绝对超时。
于是,就有了我们的并查集。(并查集是什么我就不写了)
运用并查集,若两端在同一集合中,就*2+1,若不在,就加入到同一集合,不改变答案。
ACcode:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<fstream>
#include<set>
#define ll long long
using namespace std;
int read(){
int res=,f=;
char ch;
ch=getchar();
while(ch<''||ch>''){
if(ch=='-')f=-;
ch=getchar();
}
while(ch>=''&&ch<=''){
res=res*+(ch-'');
ch=getchar();
}
return res*f;
}
const int MAXN=;
const ll mod=;
int n,m;
int f[MAXN];
ll ans;
int find_f(int x){
return x==f[x]?x:f[x]=find_f(f[x]);
}
int main(){
n=read();m=read();
for(int i=;i<=n;++i)f[i]=i;
for(int i=;i<=m;++i){
int c,b;
b=read();
c=read();
int q=find_f(b),p=find_f(c);
if(q!=p){
f[q]=c;
}
else ans=(ans*+)%mod;
printf("%lld\n",ans);
}
fclose(stdin);
fclose(stdout);
return ;
}
不过,笔者我到现在也不太能够证明这个方法的正确性。我唯一能想到的解释就是,若在同一集合,则必然找的到一条路径使得两端点联通,此时这条路径与新加入的边是等价的。那么此时新加入的边与路径构成一个只有两个点的圆,是一个全新的子图,这是+1.而新加入的边同时也可以代替那一条路径,使得原来的方案双倍。这是*2.
黑魔法师之门 (magician)-并查集的更多相关文章
- [codevs 1995]黑魔法师之门(并查集)
题目:http://codevs.cn/problem/1995/ 分析:脑补一下满足题目要求的子图肯定就是环……于是题目就变成了不断加边求环的个数.看起来有点麻烦……但是环的实质是几个小环组合起来的 ...
- [JZOJ3385] [NOIP2013模拟] 黑魔法师之门 解题报告(并查集)
Description 经过了16个工作日的紧张忙碌,未来的人类终于收集到了足够的能源.然而在与Violet星球的战争中,由于Z副官的愚蠢,地球的领袖applepi被邪恶的黑魔法师Vani囚禁在了Vi ...
- CNUOJ 535 黑魔法师之门
先摆出题 难度级别:C: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 背景: 经过了16个工作日的紧张忙碌,未来的人类终于收集到了足够的能源 ...
- CODEVS1995 || TYVJ1863 黑魔法师之门
P1863 [Poetize I]黑魔法师之门 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 经过了16个工作日的紧张忙碌,未来的人类终于收集到了足够的能源 ...
- JZOJ 3385. 【NOIP2013模拟】黑魔法师之门
3385. [NOIP2013模拟]黑魔法师之门 (Standard IO) Time Limits: 1000 ms Memory Limits: 131072 KB Detailed Limi ...
- AC日记——黑魔法师之门 codevs 1995
1995 黑魔法师之门 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 经过了16个工作日的紧张 ...
- TyvjP1863 [Poetize I]黑魔法师之门(2014-8-27)
P1863 [Poetize I]黑魔法师之门 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 经过了16个工作日的紧张忙碌,未来的人类终于收集到了足够的能源 ...
- [Poetize I]黑魔法师之门
描述 Description applepi被囚禁的地点只有一扇门,当地 人称它为“黑魔法师之门”.这扇门上画着一张无向无权图,而打开这扇门的密码就是图中[每个点的度数大于零且都是偶数]的子图的个数对 ...
- 【NOIP2013模拟】黑魔法师之门
题目描述 经过了16个工作日的紧张忙碌,未来的人类终于收集到了足够的能源.然而在与Violet星球的战争中,由于Z副官的愚蠢,地球的领袖applepi被邪恶的黑魔法师Vani囚禁在了Violet星球. ...
随机推荐
- Java的设计模式(7)— 生产者-消费者模式
生产者-消费者模式是一个经典的多线程设计模式,它为多线程间的协作提供了良好的解决方案.这个模式中,通常有两类线程,即若干个生产者线程和若干个消费者线程.生产者线程负责提交用户请求,消费者线程则负责具体 ...
- Ctex ERROR Reading
提供一个"Ctex ERROR Reading"的处理办法 方法/步骤: 1. 再我们打开一些网上下载的文档的时候可能出现错误提示 2. 这种问题一般是文件编码的问题,我们需要选择 ...
- python 之 并发编程(守护线程与守护进程的区别、线程互斥锁、死锁现象与递归锁、信号量、GIL全局解释器锁)
9.94 守护线程与守护进程的区别 1.对主进程来说,运行完毕指的是主进程代码运行完毕2.对主线程来说,运行完毕指的是主线程所在的进程内所有非守护线程统统运行完毕,主线程才算运行完毕详细解释:1.主 ...
- EF Core 2.0 执行原始查询如何防止SQL注入
using (var context = new EFCoreDbContext()) { var searchString = "Jeffcky Wang"; Formattab ...
- typescript 入门教程四
ts中的function和接口 interface PrintCallback{ // 匿名函數,返回类型为空 (success:boolean):void } interface Person{ / ...
- Excel VBA 入门基础
Private Sub RegExp_Replace() Dim RegExp As Object Dim SearchRange As Range, Cell As Range '此处定义正则表达式 ...
- GRPC代替webapi Demo。
gRPC 是一种与语言无关的高性能远程过程调用 (RPC) 框架. gRPC 的主要优点是: 现代高性能轻量级 RPC 框架. 协定优先 API 开发,默认使用协议缓冲区,允许与语言无关的实现. 可用 ...
- FaceBook CVPR2014: DeepFace解读
DeepFace是Facebook在2014年的CVPR上提出来的,后续出现的DeepID和FaceNet也都体现DeepFace的身影,可以说DeepFace是CNN在人脸识别的奠基之作,目前深 ...
- HTML中的标题<h1>标签的用法!
在HTML中,<h1>标签是命名标题的元素,并且在网页中起到了很重要的作用,但是不要只是因为想要弄成黑粗字体就使用<h1>标题标签这样不好.如果说你还想要做完网站后需要进一步做 ...
- java输出月的日历控制台
LocalDate date=LocalDate.now(); int month=date.getMonthValue(); int today=date.getDayOfMonth(); date ...