Codeforces.1040E.Network Safety(思路 并查集)
\(Description\)
有一张\(n\)个点\(m\)条边的无向图,每个点有点权。图是安全的当且仅当所有边的两个端点权值不同。保证初始时图是安全的。
现在有权值为\(x\)的病毒,若它感染了某个点\(a\),则该点点权变为\(a\oplus x\)。
求有多少数对\((S,x)\),满足病毒的权值为\(x\),且感染了\(S\)集合中的所有点后,满足图仍是安全的。
\(Solution\)
设一条边两个端点的权值为\(a,b\),病毒权值为\(x\)。因为\(a\neq b,a\oplus x\neq b\oplus x\),即对于某条边,病毒同时感染或同时不感染这条边是没事的。
而当且仅当\(x=a\oplus b\)时,其感染某一个点,会出现不合法的情况。
于是可以对每条边设一个权值\(a\oplus b\)。若病毒权值为某个\(a_i\oplus b_i\),则合法的感染点有\(n-(该权值的边形成的连通块数)\)(连通块看做一个共同的点)个,可以直接sort后并查集。
至于没出现过的某种权值,自然是有\(2^n\)种方案。
//155ms 15800KB
#include <cstdio>
#include <cctype>
#include <algorithm>
//#define gc() getchar()
#define MAXIN 300000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
#define Mod(x) x>=mod&&(x-=mod)
#define mod 1000000007
typedef long long LL;
const int N=5e5+5;
LL A[N];
int pw[N],fa[N];
char IN[MAXIN],*SS=IN,*TT=IN;
struct Edge
{
int u,v; LL w;
Edge() {}
Edge(int u,int v):u(u),v(v) {w=A[u]^A[v];}
bool operator <(const Edge &x)const{
return w<x.w;
}
}e[N];
inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
inline LL readll()
{
LL now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
int Find(int x)
{
return x==fa[x]?x:fa[x]=Find(fa[x]);
}
int main()
{
int n=read(),m=read(),K=read();
pw[0]=1;
for(int i=1; i<=n; ++i) fa[i]=i, pw[i]=pw[i-1]<<1, Mod(pw[i]);
for(int i=1; i<=n; ++i) A[i]=readll();
for(int i=1; i<=m; ++i) e[i]=Edge(read(),read());
std::sort(e+1,e+1+m);
long long ans=0;
int tot=0; e[m+1].w=-1;
for(int i=1,cnt=n,las=1,u,v; i<=m; ++i)
{
if(Find(u=e[i].u)!=Find(v=e[i].v)) fa[fa[u]]=fa[v], --cnt;
if(e[i].w!=e[i+1].w)
{
ans+=pw[cnt], cnt=n, ++tot;
for(int j=las; j<=i; ++j)
fa[e[j].u]=e[j].u, fa[e[j].v]=e[j].v;
las=i+1;
}
}
printf("%I64d\n",(ans+((1ll<<K)-tot)%mod*pw[n])%mod);
return 0;
}
Codeforces.1040E.Network Safety(思路 并查集)的更多相关文章
- [Codeforces Round #507][Codeforces 1039C/1040E. Network Safety]
题目链接:1039C - Network Safety/1040E - Network Safety 题目大意:不得不说这场比赛的题面真的是又臭又长...... 有n个点,m条边,每个点有对应的权值c ...
- Codeforces.1027F.Session in BSU(思路 并查集)
题目链接 \(Description\) 有\(n\)个人都要参加考试,每个人可以在\(ai\)或\(bi\)天考试,同一天不能有两个人考试.求最晚考试的人的时间最早能是多少.无解输出-1. \(So ...
- Codeforces 731C:Socks(并查集)
http://codeforces.com/problemset/problem/731/C 题意:有n只袜子,m天,k个颜色,每个袜子有一个颜色,再给出m天,每天有两只袜子,每只袜子可能不同颜色,问 ...
- codeforces 400D Dima and Bacteria 并查集+floyd
题目链接:http://codeforces.com/problemset/problem/400/D 题目大意: 给定n个集合,m步操作,k个种类的细菌, 第二行给出k个数表示连续的xi个数属于i集 ...
- CodeForces - 1209D Cow and Snacks 并查集
CodeForces - 1209D 题意 现在n种点心,每种点心只有一份,有k位客人,每位客人有两种想要吃的点心,你可以安排他们进场的顺序,每位客人会吃掉所有他想要吃的,并且还没被吃掉的点心.如果客 ...
- Codeforces 699D Fix a Tree 并查集
原题:http://codeforces.com/contest/699/problem/D 题目中所描述的从属关系,可以看作是一个一个块,可以用并查集来维护这个森林.这些从属关系中会有两种环,第一种 ...
- Codeforces 1027F Session in BSU - 并查集
题目传送门 传送门I 传送门II 传送门III 题目大意 有$n$门科目有考试,第$i$门科目有两场考试,时间分别在$a_i, b_i\ \ (a_i < b_i)$,要求每门科目至少参加 ...
- CodeForces - 455C Civilization (dfs+并查集)
http://codeforces.com/problemset/problem/455/C 题意 n个结点的森林,初始有m条边,现在有两种操作,1.查询x所在联通块的最长路径并输出:2.将结点x和y ...
- CodeForces 828C String Reconstruction(并查集思想)
题意:给你n个串,给你每个串在总串中开始的每个位置,问你最小字典序总串. 思路:显然这道题有很多重复填涂的地方,那么这里的时间花费就会特别高. 我们维护一个并查集fa,用fa[i]记录从第i位置开始第 ...
随机推荐
- SQL中的全局变量和局部变量(@@/@)
在SQL中,我们常常使用临时表来存储临时结果,对于结果是一个集合的情况,这种方法非常实用,但当结果仅仅是一个数据或者是几个数据时,还要去建一个表,显得就比较麻烦,另外,当一个SQL语句中的某些元素经常 ...
- html5 canvas在线文本第二步设置(字体边框)等我全部写完,我会写在页面底部
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- [整理]解析Json需要设置Mime
IIS6.0 1.打开IIS添加Mime项 关联扩展名:*.json内容类型(MIME):application/x-javascript 2.添加映射: 位置在IIS对应站点右键属性:”主目录”-” ...
- 【洛谷 P2726】 [SHOI2005]树的双中心(树的重心)
先考虑一个\(O(N^2)\)做法. 设选的两个点为\(x,y\),则一定可以将树分成两个集合\(A,B\),使得\(A\)集合所有点都去\(x\),\(B\)集合所有点都去\(y\),而这两个集合的 ...
- RabbitMQ集群使用Haproxy负载均衡
(1).下载 http://www.haproxy.org/#down (2).解压 tar -zxvf haproxy-1.5.18.tar.gz (3).安装 1).编译 make TARGET= ...
- WPF使用DataGridComboBoxColumn完成绑定
在使用DataGrid的时候,有时候需要使某些列为ComboBox,这时自然想到使用DataGridComboBoxColumn,但是如果使用的是ItemsSource数据绑定后台的对象,就会发现,这 ...
- C#使用redis学习笔记
1.官网:http://redis.io/(英) http://www.redis.cn/(中) 2.下载:https://github.com/dmajkic/redis/downloads(Wi ...
- Windows 8.1/10配置VS 2013 + MPI开发环境
关于win上安装MPI开发环境,网上能搜到的教程貌似都很老,还需要在管理员账户开发,感觉很诡异,于是自己摸索了下,不需要管理员账户,总结如下. 1. 准备 VS 2013(VS 2010及以上都行) ...
- php递归函数细节
<?php /** *php递归函数细节 *从1到5的阶乘 * */ header("Content-Type:text/html;charset=utf-8"); func ...
- Centos: -bash: unzip: command not found
安装命令:yum install -y unzip zip 同时安装unzip和zip