cf1040E. Network Safety(并查集)
题意
一张图,n个点,m条边,每个点有个权值x,x<=1e18。如果一条边的两个端点不一样,那么这条边是安全的,开始时所有边都是安全的。
现在有一个病毒y,病毒可以入侵任意的点,入侵一个点后的权值为(y^x)。
(S,y)表示病毒的权值为y,它只入侵了点集S中的点,整张图的边都是安全的。求出所有的(S,y)。
Sol
不算是特别难想的div2压轴题。。
题目中保证了任意两个节点互不相同,因此想让图不安全,对于$(A, x)$一定是存在 A内一点 ^ x = 与该点相邻点的权值
显然,对于每一条边我们可以求出对应的x。
刚开始我傻乎乎的以为任意两个节点之间对应的值都是不同的,但是这样肯定是错的
比如 101 ^ 1 = 100, 1011 ^ 1 = 1010
但就算有相同的也没关系。
考虑$x$的贡献,如果存在两个节点,假设其权值分别为a,b,满足a ^ x = b
那么该节点要么同时不出现,要么同时出现,也就相当于把这两个点看成了一个点
然后我在这里又掉了一次坑,题目中只是说了“刚开始是安全的”,我天真的以为是互不相同。。
这样的话,就有可能存在好多个点看成一个点的情况,直接用并查集维护即可
最终的答案 = $\sum_{k} 2^siz(k) + (2^k - cnt) * (2^n)$
cnt表示互不相同的x的数量
$siz(k)$表示把$x ^ k = y$的点全都缩起来后的总点数
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<map>
#include<vector>
#define Pair pair<int, int>
#define MP(x, y) make_pair(x, y)
#define fi first
#define se second
#define LL long long
using namespace std;
const int MAXN = 1e6 + , mod = 1e9 + ;
inline LL read() {
char c = getchar(); LL x = , f = ;
while(c < '' || c > '') {if(c == '-') f = -; c = getchar();}
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * f;
}
int N, M, fa[MAXN];
LL po[MAXN], c[MAXN], K;
map<LL, vector<Pair> >mp;
int find(int x) {
return fa[x] == x ? fa[x] : fa[x] = find(fa[x]);
}
main() {
N = read(); M = read(); K = read();
po[] = ;
for(int i = ; i <= N; i++) c[i] = read();
for(int i = ; i <= max((LL)N, K); i++) po[i] = (1ll * * po[i - ]) % mod;
for(int i = ; i <= M; i++) {
int x = read(), y = read();
mp[c[x] ^ c[y]].push_back(MP(x, y));
}
LL ans = ;
map<LL, vector<Pair> >::iterator it;
for(int i = ; i <= N; i++) fa[i] = i;
for(it = mp.begin(); it != mp.end(); it++) {
LL val = it -> first;
vector<Pair> now = it -> second;
vector<int> res;
for(int i = ; i < now.size(); i++) {
int fx = find(now[i].fi), fy = find(now[i].se);
res.push_back(fx); res.push_back(fy);
if(fx == fy) continue;
fa[fx] = fy;
}
for(int i = ; i < res.size(); i++) fa[res[i]] = res[i];
(ans += po[tot]) %= mod;
}
printf("%I64d", (ans + 1ll * (po[K] - mp.size()) * po[N] % mod) % mod);
return ;
}
cf1040E. Network Safety(并查集)的更多相关文章
- POJ 2236 Wireless Network(并查集)
传送门 Wireless Network Time Limit: 10000MS Memory Limit: 65536K Total Submissions: 24513 Accepted ...
- poj 2236:Wireless Network(并查集,提高题)
Wireless Network Time Limit: 10000MS Memory Limit: 65536K Total Submissions: 16065 Accepted: 677 ...
- POJ 2236 Wireless Network (并查集)
Wireless Network 题目链接: http://acm.hust.edu.cn/vjudge/contest/123393#problem/A Description An earthqu ...
- POJ 2236:Wireless Network(并查集)
Wireless Network Time Limit: 10000MS Memory Limit: 65536K Total Submissions: 36363 Accepted: 150 ...
- POJ3694:Network(并查集+缩点+lca)
Network Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 13172 Accepted: 4774 题目链接:htt ...
- Brain Network (easy)(并查集水题)
G - Brain Network (easy) Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & ...
- 【POJ - 2236】Wireless Network (并查集)
Wireless Network 这接翻译了 Descriptions 地震发生在东南亚.ACM(亚洲合作医疗团队)已经与膝上电脑建立了无线网络,但是一次意外的余震袭击,网络中的所有计算机都被打破了. ...
- Codeforces1023F Mobile Phone Network 【并查集】【最小生成树】
题目大意: 给一些没安排权值的边和安排了权值的边,没被安排的边全要被选入最小生成树,问你最大能把它们的权值和安排成多少.题目分析:假设建好了树,那么树边与剩下的每一条边都能构成一个环,并且非树边的权值 ...
- POJ3694 Network - Tarjan + 并查集
Description 给定$N$个点和 $M$条边的无向联通图, 有$Q$ 次操作, 连接两个点的边, 问每次操作后的图中有几个桥 Solution 首先Tarjan找出边双联通分量, 每个双联通分 ...
随机推荐
- Redis简介及基础知识
一.Redis简介 Redis是什么?两句话可以做下概括: 1. 是一个完全开源免费的key-value内存数据库 2. 通常被认为是一个数据结构服务器,主要是因为其有着丰富的数据结构 string( ...
- python 开发微信 自定义菜单
1.再次重复说明,下面代码只是为了简单说明接口获取方式.实际中并不推荐,尤其是业务繁重的公众号,更需要中控服务器,统一的获取accessToken. vim basic.py #name: basic ...
- C++中const型数据的小结
由于与对象又管的const型数据种类较多,形式又有些相似,往往难记,容易混淆,因此总结一下相关用法,具体用法可查看下方链接 C++中对象的常引用 C++中指向对象的常指针和指向常对象的指针 C++中的 ...
- SpringSecurity03 基于内存验证
1 需求 现有一个编写好的系统,需要实现用户登录验证即可,同时根据用户的权限来限制用户可以访问的接口 2 编写SpringSecurity配置类 继承 WebSecurityConfigurerAda ...
- AngularJs(Part 9)--AngularJS 表单
AngularJS 表单 AngularJS使用了MVX的结构,我们可以是传统的表单更加强大.比如过去我们得自己写一大堆验证,比过过去我们得自己转换用户的输入, 现在这些工作全部可以交给Ang ...
- 树莓派 Learning 002 装机后必要的操作 --- 10 实现本地电脑与远程桌面之间复制粘贴(传输)文件
树莓派 装机后必要的操作 - 实现本地电脑与远程桌面之间复制粘贴(传输)文件 我的树莓派型号:Raspberry Pi 2 Model B V1.1 装机系统:NOOBS v1.9.2 PC端系统:w ...
- hdu1051
#include<iostream> #include<algorithm> using namespace std; struct SIZE { int l; int w; ...
- 解析Xml文件的三种方式及其特点
解析Xml文件的三种方式 1.Sax解析(simple api for xml) 使用流式处理的方式,它并不记录所读内容的相关信息.它是一种以事件为驱动的XML API,解析速度快,占用内存少.使用 ...
- Sharding-JDBC 使用入门和基本配置
一.什么是Sharding-JDBC Sharding-JDBC定位为轻量级Java框架,在Java的JDBC层提供的额外服务.它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理 ...
- ProtoBuf练习(五)
表类型 protobuf语言的maps字段类型相当于C++语言的std::map类型 工程目录结构 $ ls proto/ sample_maps.proto proto文件 $ cat proto/ ...