Codeforces 724G - Xor-matic Number of the Graph(线性基)
一道还算不套路的线性基罢……
首先由于图不连通,并且不同连通块之间的点显然不可能产生贡献,因此考虑对每个连通块单独计算贡献。按照 P4151 的套路可以对每个连通块先找出它的一棵生成树,记 \(d_u\) 为 \(u\) 到生成树树根上所有边权值的异或和。对于生成树上所有非树边 \((u,v,w)\),\(u\to v\) 在树上的路径与这条边本身显然会形成一个环,且环的权值为 \(d_u\oplus d_v\oplus w\),我们将这个环插入线性基。那么对于该联通块中的两点 \(u,v\),所有 \(u\to v\) 路径本质不同的异或和都可以写成 \(d_u\oplus d_v\oplus x\) 的形式,其中 \(x\) 可以表示为线性基中向量的线性组合。
显然暴力枚举 \(u,v\) 是不可行的,考虑换个方式计算贡献,对于每一个二进制位 \(2^p\),我们计算有多少个 \(u,v,S\) 满足 \(d_u\oplus d_v\oplus\operatorname{xor}\limits_{x\in S}x\) 的 \(2^p\) 位为 \(1\),那么会产生 \(2^p\times\text{满足条件的三元组}(u,v,S)\text{的个数}\) 的贡献。那么这个贡献怎么计算呢?分两种情况,设线性基为 \(b_1,b_2,\cdots,b_m\),那么:
- 如果 \(\exist i\) 满足 \(b_i\) 的 \(2^p\) 位为 \(1\),那么不论剩下 \(m-1\) 个数选不选,我们总可以控制 \(b_i\) 的选/不选来实现 \(2^p\) 的第 \(i\) 位为 \(1\),因此可以表示为 \(\operatorname{xor}\limits_{x\in S}x\) 的形式,并且 \(2^p\) 位为 \(1\) 的数的个数为 \(2^{p-1}\)。而根据线性基的性质,对于所有可以表示 \(\operatorname{xor}\limits_{x\in S}x\) 的形式的 \(y\),都恰好存在 \(2^{t-m}\) 个集合 \(S\) 满足 \(\operatorname{xor}\limits_{x\in S}x=y\),其中 \(t\) 为非树边个数。也就是说不论 \(u,v\) 是什么,总有 \(2^{t-1}\) 个集合 \(S\) 满足 \(d_u\oplus d_v\oplus\operatorname{xor}\limits_{x\in S}x\) 的 \(2^p\) 位为 \(1\),因此符合条件的 \(u,v,S\) 的个数为 \(2^{t-1}\times\dbinom{n}{2}\)。
- 否则不论 \(S\) 是什么,都有 \(\operatorname{xor}\limits_{x\in S}x\) 的 \(2^p\) 位为 \(0\),故 \((u,v,S)\) 符合条件当且仅当 \(d_u,d_v\) 的 \(2^p\) 位的值不同,开个桶统计下有多少个 \(u\) 满足 \(d_u\) 的 \(2^p\) 位为 \(0\),贡献即为 \(2^t\times d_p\times(siz-d_p)\),其中 \(siz\) 为连通块大小。
剩下的就是乱搞搞的事了,时间复杂度 \(n\log^2v\),其中 \(v\) 为值域大小。
const int MAXN=1e5;
const int MAXM=2e5;
const int MAXB=60;
const int MOD=1e9+7;
const int INV2=5e8+4;
int n,m,cnt=0,num[MAXB+5];ll a[MAXB+5];
int hd[MAXN+5],to[MAXM*2+5],nxt[MAXM*2+5],ec=0;ll val[MAXM*2+5];
void adde(int u,int v,ll w){to[++ec]=v;val[ec]=w;nxt[ec]=hd[u];hd[u]=ec;}
void init(){memset(a,0,sizeof(a));cnt=0;}
void ins(ll x){
for(int i=MAXB;~i;i--) if(x>>i&1){
if(!a[i]){++cnt;a[i]=x;return;}
else x^=a[i];
}
}
bitset<MAXN+5> vis;
ll dis[MAXN+5];vector<int> v;
void dfs(int x,ll cur){
dis[x]=cur;vis[x]=1;v.pb(x);
for(int e=hd[x];e;e=nxt[e]){
int y=to[e];ll z=val[e];
if(!vis[y]) dfs(y,cur^z);
else ins(dis[x]^dis[y]^z);
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int u,v;ll w;scanf("%d%d%lld",&u,&v,&w);
adde(u,v,w);adde(v,u,w);
}
int ans=0;
for(int i=1;i<=n;i++) if(!vis[i]){
init();memset(num,0,sizeof(num));v.clear();dfs(i,0);
for(int j=0;j<=MAXB;j++) for(int u:v)
if(dis[u]>>j&1) num[j]++;
for(int j=0;j<=MAXB;j++){
bool flg=0;
for(int k=0;k<=MAXB;k++) if(a[k]>>j&1) flg=1;
if(flg) ans=(ans+(1ll<<j)%MOD*((1ll<<cnt-1)%MOD)%MOD*v.size()%MOD*(v.size()-1)%MOD*INV2)%MOD;
else ans=(ans+(1ll<<j)%MOD*((1ll<<cnt)%MOD)%MOD*num[j]%MOD*(v.size()-num[j]))%MOD;
}
} printf("%d\n",ans);
return 0;
}
Codeforces 724G - Xor-matic Number of the Graph(线性基)的更多相关文章
- Codeforces 724 G Xor-matic Number of the Graph 线性基+DFS
G. Xor-matic Number of the Graph http://codeforces.com/problemset/problem/724/G 题意:给你一张无向图.定义一个无序三元组 ...
- CodeForces - 724G:Xor-matic Number of the Graph
两点之间的任意路径都可表示为 随便某一条路径xor任何多个环, 然后可以用线性基来做,这样不会重复的, 另外必须一位一位的处理,xor是不满足结合律的 #include<cstdio> ...
- Codeforces.724G.Xor-matic Number of the Graph(线性基)
题目链接 \(Description\) 给定一张带边权无向图.若存在u->v的一条路径使得经过边的边权异或和为s(边权计算多次),则称(u,v,s)为interesting triple(注意 ...
- Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) G - Xor-matic Number of the Graph 线性基好题
G - Xor-matic Number of the Graph 上一道题的加强版本,对于每个联通块需要按位算贡献. #include<bits/stdc++.h> #define LL ...
- codeforces 724G - Xor-matic Number of the Graph 线性基+图
题目传送门 题意:给出衣服无向带权图,问有多少对合法的$<u,v,s>$,要求$u$到$v$存在一条路径(不一定是简单路径)权值异或和等于$s$,并且$u<v$.求所有合法三元组的s ...
- codeforces 1101G (Zero XOR Subset)-less 前缀异或+线性基
题目传送门 题意:给出一个序列,试将其划分为尽可能多的非空子段,满足每一个元素出现且仅出现在其中一个子段中,且在这些子段中任取若干子段,它们包含的所有数的异或和不能为0. 思路:先处理出前缀异或,这样 ...
- Educational Codeforces Round 58 (Rated for Div. 2) G 线性基
https://codeforces.com/contest/1101/problem/G 题意 一个有n个数字的数组a[],将区间分成尽可能多段,使得段之间的相互组合异或和不等于零 题解 根据线性基 ...
- Codeforces.472F.Design Tutorial: Change the Goal(构造 线性基 高斯消元)
题目链接 \(Description\) 给定两个长为\(n\)的数组\(x_i,y_i\).每次你可以选定\(i,j\),令\(x_i=x_i\ \mathbb{xor}\ x_j\)(\(i,j\ ...
- bzoj 2115 [Wc2011] Xor 路径最大异或和 线性基
题目链接 题意 给定一个 \(n(n\le 50000)\) 个点 \(m(m\le 100000)\) 条边的无向图,每条边上有一个权值.请你求一条从 \(1\)到\(n\)的路径,使得路径上的边的 ...
- bzoj2115 [Wc2011] Xor——高斯消元 & 异或线性基
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2115 异或两次同一段路径的权值,就相当于没有走这段路径: 由此可以得到启发,对于不同的走法, ...
随机推荐
- 返回值优化 RVO
<深度探索C++对象模型>-- 2.3 返回值的初始化 & 在编译器层面做优化
- CSS绘制三角的小技巧
网页中常见一些三角形,使用css直接画出来就可以,不必做成图片或者字体图标当把一个盒子的高和宽的长度都设置为0,并且分别指定边框样式时,就会得到以下图形: 受此启发,可以知道三角是如何制作的(想要保留 ...
- 人人都写过的5个Bug!
大家好,我是良许. 计算机专业的小伙伴,在学校期间一定学过 C 语言.它是众多高级语言的鼻祖,深入学习这门语言会对计算机原理.操作系统.内存管理等等底层相关的知识会有更深入的了解,所以我在直播的时候, ...
- 《基于SIRS模型的行人过街违章传播研究》
My Focus: 行人违章过街 这一行为的传播与控制 Behavior definition in this paper: 人在生活中表现出来的生活态度及具体的生活方式 Title: Researc ...
- Envoy实现.NET架构的网关(二)基于控制平面的动态配置
什么是控制平面 上一篇我们讲了文件系统的动态配置,这次我们来看看通过Control Panel来配置Envoy.控制平面就是一个提供Envoy配置信息的单独服务,我们可以通过这个服务来修改Envoy的 ...
- CentOS7 安装oracle 11g (11.2.0.1.0)
1.安装依赖: #yum -y install binutils compat-libcap1 compat-libstdc++-33 gcc gcc-c++ glibc glibc-devel ks ...
- 什么是 Webhook?
1. 什么是 Webhook? Webhook 是一个 API 概念,是微服务 API 的使用范式之一,也被成为反向 API,即前端不主动发送请求,完全由后端推送:举个常用例子,比如你的好友发了一条朋 ...
- 谷粒 | 项目集成redis
添加依赖 由于redis缓存是公共应用,所以我们把依赖与配置添加到了common模块下面,在common模块pom.xml下添加以下依赖 <!-- redis --> <depend ...
- 一.Promise入门准备阶段
一.Promise入门准备阶段 1.区别实例对象呵函数对象 2.两种类型的回调函数(同步与异步) 2.1 同步回调 2.2 异步回调 3.JS的error处理 3.1 错误的类型 3.2 错误处理与错 ...
- 在k8s中收集jvm异常dump文件到OSS
现状 加参数 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=logs/test.dump 可以实现在jvm发生内存错误后 会生成dump文件 方便开 ...