题目链接:1039C - Network Safety/1040E - Network Safety

题目大意:不得不说这场比赛的题面真的是又臭又长......

  有n个点,m条边,每个点有对应的权值c[i],权值的范围是\([0,2^{k}-1]\)。称一条边为安全的,当且仅当边两端的点权不同,题目保证初始状态下的所有边都是安全的。现在问你有多少个pair<set<int> A,int x>(找不到更好的语言来描述了),使得当所有A中的点的权值都变为c[i] xor x时,仍然保证所有m条边都是安全的。

题解:显然当没有其他限制时,对任意的x,set<int>A的个数都为\(2^{n}\),考虑一条边{u,v},若x=c[u] xor c[v],则u和v会被绑定,即这两个点要么都在A内,要么都不在A内。这样对任意的x,我们就能用并查集求出连通块的个数(在被绑定的两个点之间连边),此时设连通块个数为sz,则对于这个x,对应的set<int>A的个数就有\(2^{sz}\)个。显然对应set<int>A的个数不为\(2^{n}\)的x不会超过m个,我们只需对所有相同的m进行分开求解。这样最终的答案就是\(\sum_{i=1}^{cnt} 2^{sz_i}+(2^{k}-cnt)\cdot 2^{n}\)。

   注意若直接用平常的方法对fa数组进行初始化的话时间复杂度会变为O(nm),会导致TLE。因此在处理每一个x时,要记录下被修改的点,还原时只需还原这些点对应的值就好了。

#include<bits/stdc++.h>
using namespace std;
#define N 500001
#define LL long long
#define MOD 1000000007
set<LL>s;
struct rua{LL x,u,v;}a[N];
LL n,m,k,c[N],fa[N],sz,cnt,ans;
bool cmp(rua x,rua y){return x.x<y.x;}
LL Find(LL x){return fa[x]==x?x:fa[x]=Find(fa[x]);}
LL qow(LL x,LL y){return y?(y&?x*qow(x,y-)%MOD:qow(x*x%MOD,y/)):;}
void add(LL u,LL v)
{
s.insert(u),s.insert(v);
if(Find(u)!=Find(v))fa[Find(u)]=Find(v),sz--;
}
int main()
{
scanf("%I64d%I64d%I64d",&n,&m,&k);
for(LL i=;i<=n;i++)
scanf("%I64d",&c[i]),fa[i]=i;
for(LL i=;i<=m;i++)
scanf("%I64d%I64d",&a[i].u,&a[i].v),
a[i].x=c[a[i].u]^c[a[i].v];
sort(a+,a+m+,cmp);
for(LL i=;i<=m;)
{
LL j=i;sz=n;
for(auto x:s)fa[x]=x;s.clear();
while(j<=m && a[j].x==a[i].x)
add(a[j].u,a[j].v),j++;
i=j,cnt++,ans+=qow(,sz),ans%=MOD;
}
return printf("%I64d\n",(ans+(qow(,k)+MOD-cnt)*qow(,n)%MOD)%MOD),;
}

[Codeforces Round #507][Codeforces 1039C/1040E. Network Safety]的更多相关文章

  1. Codeforces.1040E.Network Safety(思路 并查集)

    题目链接 \(Description\) 有一张\(n\)个点\(m\)条边的无向图,每个点有点权.图是安全的当且仅当所有边的两个端点权值不同.保证初始时图是安全的. 现在有权值为\(x\)的病毒,若 ...

  2. Codeforces Round #507 (Div. 2, based on Olympiad of Metropolises) D mt19937

    https://codeforces.com/contest/1040/problem/D 用法 mt19937 g(种子); //种子:time(0) mt19937_64 g(); //long ...

  3. Codeforces Round #507 Div. 1

    D:类似于noip2018d1t3,子树内的链应该贪心的尽量合并而不是拆开.则设f[i]为i子树内满足选的链尽量多的情况下根所在的链的最长长度即可.于是可以线性对某个k求得答案. 注意到长度为k的链不 ...

  4. 题解——Codeforces Round #507 (based on Olympiad of Metropolises) T2(模拟)

    T2还是模拟 枚举一下第一个放哪里 然后贪心的反转即可 虽然我也不会证,但是这题肯定有解qwq #include <cstdio> #include <algorithm> # ...

  5. 题解——Codeforces Round #507 (based on Olympiad of Metropolises) T1 (模拟)

    暴力模拟即可 就是情况略多 #include <cstdio> #include <algorithm> #include <cstring> using name ...

  6. Codeforces Round #507 (Div. 2)C(贪心,逆向遍历,构造)

    #include<bits/stdc++.h>using namespace std;int order[300007];long long t[300007],ans[300007];i ...

  7. 【Codeforces Round #507 (Div. 2, based on Olympiad of Metropolises) B】Shashlik Cooking

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 翻转一次最多影响2k+1个地方. 如果n<=k+1 那么放在1的位置就ok.因为能覆盖1..k+1 如果n<=2k+1 ...

  8. 【Codeforces Round #507 (Div. 2, based on Olympiad of Metropolises) A】Palindrome Dance

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] i从1..n/2循环一波. 保证a[i]和a[n-i+1]就好. 如果都是2的话填上min(a,b)*2就好 其他情况跟随非2的. ...

  9. [Codeforces Round #516][Codeforces 1063B/1064D. Labyrinth]

    题目链接:1063B - Labyrinth/1064D - Labyrinth 题目大意:给定一个\(n\times m\)的图,有若干个点不能走,上下走无限制,向左和向右走的次数分别被限制为\(x ...

随机推荐

  1. Unity的Input输入

    Unity中的输入管理器由Input类进行操控.官方文档地址:https://docs.unity3d.com/ScriptReference/Input.html 中文翻译的话可以在这里:http: ...

  2. Unity的RuntimeInitializeOnLoadMethod属性初探

    Unity 5.0开始增加了RuntimeInitializeOnLoadMethodAttribute,这样就很方便在游戏初始化之前做一些额外的初始化工作,比如:Bulgy参数设置.SDK初始等工作 ...

  3. 搭建SpringCloud-Eureka 注册中心以及服务提供与调用 快速了解 SpringCloud-Eureka

    原文地址:  搭建SpringCloud-Eureka 注册中心以及服务提供与调用   纸上得来终觉浅,绝知此事要躬行啊~果然看着很easy,自己搞起来就是各种坑~各位看官,容我慢慢道来~ 关于spr ...

  4. vue 父子组件的方法调用

    $emit 子组件触发父组件的方法: <!-- 子组件 --> <template> <div id="child"> <button @ ...

  5. [Vuex] Perform Async Updates using Vuex Actions with TypeScript

    Mutations perform synchronous modifications to the state, but when it comes to make an asynchronous ...

  6. ionic 状态栏显示异常 statusBar

    从主分支上新建一个分支开发另一个app, 生成之后手机上显示状态栏异常, 如下图, 只显示了电池的色块, 百思不得其解啊. 各种猜测无果, 对比config.xml, 发现statusBar插件版本不 ...

  7. 基于Clang的缓存型C++编译器Zapcc

    http://www.infoq.com/cn/news/2018/06/zapcc-caching-cpp-compiler-open https://blog.csdn.net/joy0921/a ...

  8. 使用pyenv安装多个Python版本

    pyenv是一个便于使用多版本Python环境的工具 pyenv使用shell脚本编写的,只需要下载就可以使用了,不需要root用户,这个我比较喜欢. 具体介绍看网址:https://github.c ...

  9. 华为ap3010DN-V2刷出胖AP并配置接入POE交换机实现上网

    配置FAT AP二层组网示例 组网图形 图1 配置二层网络WLAN基本业务示例组网图 组网需求 如图1所示,FAT AP通过有线方式接入Internet,通过无线方式连接终端.现某企业分支机构为了保证 ...

  10. AYUI -AYUI风格的 超美 百度网盘8.0

    2017-03-23 19:18:43 (截止到2017-3-23 20:20:33开发结束)体验地址:  http://pan.baidu.com/s/1bX28H4 新增传输列表 ======== ...