[Codeforces Round #507][Codeforces 1039C/1040E. Network Safety]
题目链接: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]的更多相关文章
- Codeforces.1040E.Network Safety(思路 并查集)
题目链接 \(Description\) 有一张\(n\)个点\(m\)条边的无向图,每个点有点权.图是安全的当且仅当所有边的两个端点权值不同.保证初始时图是安全的. 现在有权值为\(x\)的病毒,若 ...
- 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 ...
- Codeforces Round #507 Div. 1
D:类似于noip2018d1t3,子树内的链应该贪心的尽量合并而不是拆开.则设f[i]为i子树内满足选的链尽量多的情况下根所在的链的最长长度即可.于是可以线性对某个k求得答案. 注意到长度为k的链不 ...
- 题解——Codeforces Round #507 (based on Olympiad of Metropolises) T2(模拟)
T2还是模拟 枚举一下第一个放哪里 然后贪心的反转即可 虽然我也不会证,但是这题肯定有解qwq #include <cstdio> #include <algorithm> # ...
- 题解——Codeforces Round #507 (based on Olympiad of Metropolises) T1 (模拟)
暴力模拟即可 就是情况略多 #include <cstdio> #include <algorithm> #include <cstring> using name ...
- Codeforces Round #507 (Div. 2)C(贪心,逆向遍历,构造)
#include<bits/stdc++.h>using namespace std;int order[300007];long long t[300007],ans[300007];i ...
- 【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 ...
- 【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的. ...
- [Codeforces Round #516][Codeforces 1063B/1064D. Labyrinth]
题目链接:1063B - Labyrinth/1064D - Labyrinth 题目大意:给定一个\(n\times m\)的图,有若干个点不能走,上下走无限制,向左和向右走的次数分别被限制为\(x ...
随机推荐
- 无法打开运行空间池,服务器管理器winrm插件可能已损坏或丢失
在使用windows2012 的服务器或云主机时,服务器安装不了iis服务. 提示 “无法打开运行空间池,服务器管理器winrm插件可能已损坏或丢失”. 这个问题可能的原因是您的机器未设置虚拟内存,可 ...
- Python3 与 C# 网络编程之~ 网络基础篇
最新版本查看:https://www.cnblogs.com/dotnetcrazy/p/9919202.html 入门篇 官方文档:https://docs.python.org/3/library ...
- Lua模块的加载与内存释放
今天早上听说一件事情让我觉得很诡异的事情:公司线上的一款游戏,加载一份配置资源后,内存涨了几十M,然后内存再也下不来了.因为好奇,所以要来了最大的一个配置文件(4.5M,去除空格与换行后的大小),进行 ...
- XSplit Quality, VBV-Buffer, VBV-Maxrate and Preset Settings
XSplit uses the x264 encoder, so let's start off by saying that parameters mentioned in the title, w ...
- mssql f_Split
mssql可以如下CREATE FUNCTION [dbo].[f_Split] ( @val varchar(max),@Splits varchar(100))RETURNS @Table TAB ...
- Django根据现有数据库建立/更新model
Django引入外部数据库还是比较方便的,步骤如下: 创建一个项目,修改seting文件,在setting里面设置你要连接的数据库类型和连接名称,地址之类,和创建新项目的时候一致 运行下面代码可以自动 ...
- Teigha.NET开发入门1- Teigha介绍
对于CAD开发,无疑较强大的方式是Lisp.AutoCAD二次开发,且学习资源丰富,依靠强大的AutoCAD的环境可以干很多事,省很多力.但若要脱离AutoCAD环境,那就当属Teigha了. 名称问 ...
- 前端切图实战(PSD设计稿转化为前端)
课程来源:https://www.imooc.com/learn/668 一:读设计稿 划分:头部.尾部.公共部分.大概分多少块.logo的重用.列表有哪些.各部分用什么技术实现等等. 二:建立项目目 ...
- Docker Mongo数据库主从同步配置方法
一.具体操作方法 1.启两个Mongo容器 docker run --name mongo1 -p 21117:27017 -d mongo --noprealloc --smallfiles --r ...
- easylog -- Linux 下的简单日志库
之前使用 log4c 或者 log4cpp 的时候, 总需要配置一些文件和链接库之类复杂的配置. 虽然越复杂越说明这个软件支持的功能多.可选择性强, 但是对于一个小的项目,或者要研究他人的代码而加点儿 ...