CF724G 【Xor-matic Number of the Graph】
题目就不翻译了吧,应该写的很清楚了。。。
首先 \(,\) 不懂线性基的可以戳这里。知道了线性基\(,\) 但是从来没有写过线性基和图论相结合的\(,\) 可以戳这里。
好\(,\) 点完了这些前置技能之后,我们就可以来愉快的切题啦!
正片\(:\)
类比\([WC\) \(2011]\) 最大\(xor\)和路径\(,\) 我们肯定要找环\(,\) 找完环后再用环去构造线性基\(,\) 因为还是那句话嘛\(:\) 任何一条复杂路径\(,\) 都能有起始两点的一条简单路径再加上若干个环组成。
那么接下来的问题就是\(:\)如何求出亦或值的和?
\(en\)~~~,直接依据线性基,求出可以被这个线性基构造出的所有亦或值的和,然后相加,呃,是个好方法。
可惜\(,\) 很不幸\(,\) \(xor\)不满足分配律。然后我又冥思苦想了2天,终于找到了“\(n\)个数中,任取几个数的亦或和的和”这个问题的\(O(n*63*63)\)的做法,高兴了好一阵子,然后发现。。。哎\(,\) 现在想想还是难受啊。
然后痛定思痛\(,\) 改变视角——\(woc\),原来这么简单\(!\)
不再考虑每一对数的\(xor\)和,我们改变目标 \(,\)去求:对于每一对点的每一位,有多少种方案能使该位的\(xor\)和位1。
对于我们原先就求出来的\(d[1]\)到\(d[n]\) \((\)就是各个点到1号点的一条简单路径的\(xor\)和\()\) \(,\) 我们要想求出\(u\)到\(v\)的一条简单路径\(,\) 只需要用\(d[u]\) \(xor\) \(d[v]\)即可\(,\) 因为重复走到路径会因为\(xor\)操作而抵消掉。
若线性基中有\(cnt\)个非零位,则一共会产生\(2^{cnt}\)个不同的\(xor\)值。
知道了这些以后\(,\) 我们就可以开始讨论了\(:\)
\(1.\) \(d[u]\) \(xor\) \(d[v]\)第\(k\)位为1:这样的话,我们就需要不取第\(k\)个线性基\((\)因为只有第\(k\)位为1了才会对答案产生贡献嘛\(!\) \()\) \(,\) 这样的话,该项对于答案的贡献即为\(:\) \(2^{k}*2^{cnt-1}\)。
\(2.\) \(d[u]\) \(xor\) \(d[v]\)第\(k\)位为0\(:\) 显然,一定要取\(k\)个线性基\(,\) 对答案的贡献即为\(:\) \(2^k*2^{cnt-1}\)。
尽管这样\(,\) 时间复杂度依然是\(O(n^2*63)\)的\(,\) 吃不消\(,\) 那么哪里还有优化的空间呢\(?\)
注意到\(,\) \(d[i]\)第\(k\)位的值是固定的\(,\) 那么我们就可以不单独讨论\("d[u]\) xor \(d[v]"\)对于答案的贡献\(,\) 直接讨论\(d[u]\)对于答案的贡献。
先统计出第\(k\)位为\(0\)的数的个数\(,\) 我们将其记为\(x\) \(,\) 再统计出第\(k\)位为\(1\)的数的个数\(,\) 记为\(y\) \(,\) 总共有\(point\)个点。
分为\(4\)种情况讨论\(:\)
\(1.\) \(d[i]\)的第\(k\)位为\(1\) \(,\) 线性基中有第\(k\)位为\(1\)的数\(:\) 此时我们有两种选择:\(a.\) 选线性基中的\(,\) 另一个点选择第\(k\)位为\(0\)的。 \(b.\) 不选线性基中的\(,\) 另一个点选择第\(k\)位为\(1\)的。总体对于答案的贡献为:\(2^k*2^{cnt-1}*(point-1)\) \(,\) 减\(1\)就是为了把自己给去掉。
\(2.\) \(d[i]\)的第\(k\)位为\(1\) \(,\) 线性基中没有第\(k\)位为\(1\)的数\(:\) 这个时候另一个点只能取第\(k\)位为\(0\)的\(,\) 所以总贡献为\(:\) \(2^k*2^{cnt}*x\)。
\(3.\) \(d[i]\)的第\(k\)位为\(0\) \(,\) 线性基中有第\(k\)位为\(1\)的数\(:\) 一样的\(,\) 两种选择\(:\) \(a.\) 选线性基中的\(,\) 另一个点选择第\(k\)位为\(0\)的。 \(b.\) 不选线性基中的\(,\) 另一个点选择第\(k\)位为\(1\)的。总贡献为\(:\) \(2^k*2^{cnt-1}*(point-1)\)。
\(3.\) \(d[i]\)的第\(k\)位为\(0\) \(,\) 线性基中没有第\(k\)位为\(1\)的数\(:\) 另一个点只能取第\(k\)位为\(1\)的\(,\) 总贡献\(:\) \(2^k*2^{cnt}*y\)。
- 最后别忘记给答案除个\(2\)就\(OK\)啦\(!(\)要用逆元哦\()\)
代码\(:\)
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=100005,M=400005,p=1e9+7,inv=500000004;
ll b[65],dist[M],d[N],a[N],two[65],s[N],z,ans,cnt,point;
int head[N],vet[M],nxt[M],c[65],n,m,x,y,tot;
bool vis[N],used[M];
void add(int x,int y,ll z){
nxt[++tot]=head[x];
vet[tot]=y;
head[x]=tot;
dist[tot]=z;
}
void insert(ll x){
for (int i=62;i>=0;i--)
if (x>>i)
if (b[i]) x^=b[i];
else {b[i]=x; break;}
}
void dfs(int u){
a[++point]=d[u]; vis[u]=true;
for (int i=head[u];i;i=nxt[i]){
int v=vet[i];
if (!vis[v]){
d[v]=d[u]^dist[i];
dfs(v);
} else
if (!used[i^1]){
used[i^1]=true;
insert(d[u]^d[v]^dist[i]);
}
}
}
ll calc(){
ll ans=0;
for (int j=0;j<=62;j++){
ll x=0,y=0,flag=0;
for (int i=1;i<=point;i++)
if (a[i]>>j&1) x++; else y++;
for (int i=0;i<=62;i++)
if (b[i]>>j&1) flag=1;
for (int i=1;i<=point;i++)
if (a[i]>>j&1)
if (flag)
(ans+=two[cnt-1]*(ll)(point-1)%p*two[j]%p)%=p;
else
(ans+=two[cnt]*y%p*two[j]%p)%=p;
else
if (flag)
(ans+=two[cnt-1]*(ll)(point-1)%p*two[j]%p)%=p;
else
(ans+=two[cnt]*x%p*two[j]%p)%=p;
}
return ans;
}
int main(){
scanf("%d %d",&n,&m); tot=1;
for (int i=1;i<=m;i++){
scanf("%d %d %lld",&x,&y,&z);
add(x,y,z); add(y,x,z);
}
two[0]=1;
for (int i=1;i<=64;i++)
two[i]=two[i-1]*2%p;
for (int i=1;i<=n;i++)
if (!vis[i]){
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
point=0,cnt=0;
dfs(i);
for (int j=0;j<=62;j++) cnt+=(b[j]>0);
(ans+=calc())%=p;
}
ans=ans*inv%p;
printf("%lld\n",ans);
return 0;
}
CF724G 【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 题意:给你一张无向图.定义一个无序三元组 ...
- CF 724 G. Xor-matic Number of the Graph
G. Xor-matic Number of the Graph 链接 题意: 给定一个无向图,一个interesting的三元环(u,v,s)满足,从u到v的路径上的异或和等于s,三元环的权值为s, ...
- 【LeetCode-面试算法经典-Java实现】【136-Single Number(仅仅出现一次的数字)】
[136-Single Number(仅仅出现一次的数字)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given an array of integers, ev ...
- 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 ...
- 【年度开源、工具合集】牛津计划,DMTK,Graph Engine…提高你的工作效率!
本篇合集包括以下三个部分的内容: 1.微软亚洲研究院过去一年的所有开源合集,如分布式机器学习工具包DMTK等. 2.利用微软研究院的技术提高工作效率的工具合集,如让没有机器学习背景的开发人员也能开发出 ...
- WCF学习系列一【WCF Interview Questions-Part 1 翻译系列】
http://www.topwcftutorials.net/2012/08/wcf-faqs-part1.html WCF Interview Questions – Part 1 This WCF ...
- 【PC网站前端架构探讨系列】关于中小型PC网站前端架构方案的讨论与实践
目 录 1.遇到的问题 2.目标 3.探讨 4.架构设想 5.流程 6.初步实现 7.存在问题 8.最后 遇到的问题 我在这个系列上篇文章 已经讲解并开始逐步应用模块化思想,不知大家还记不记得,题 ...
- 【Java&Android开源库代码剖析】のandroid-smart-image-view
Android应用开发已经进入到相对成熟的阶段,特别在国外,涌现出了各式各样的成熟稳定的开源库,供普通开发者使用.这种情况虽然极大加速了app开发的进程,但同时带来的问题是大多数普通开发者在使用这些开 ...
- 【Cocos2d-x游戏引擎开发笔记(25)】XML解析
原创文章,转载请注明出处:http://blog.csdn.net/zhy_cheng/article/details/9128819 XML是一种非常重要的文件格式,由于C++对XML的支持非常完善 ...
随机推荐
- 目标识别AI资料
朋友推荐的, 还有自己搜的. 入门可以看看. 网上资料应该不少, 一搜一大把, 简单记下地址. Review of Deep Learning Algorithms for Object Detect ...
- web-UI自动化必会技能—xpath轴,了解一下?
本来以为不会再更新UI自动化相关的东西了,不过最近群里的朋友在搞UI,提出了许多问题,我看了下,大多还是页面元素定位类的问题,那今天就再讲点. 一.先了解xpath 说到元素定位,大家应该都知道常见的 ...
- Web最最基础2
网页元素HTML 列表 (1)无序列表 <ul> <li>****</li> <li>***</li></ul> 更多样式:&l ...
- Pandas | Dataframe的merge操作,像数据库一样尽情join
今天是pandas数据处理第8篇文章,我们一起来聊聊dataframe的合并. 常见的数据合并操作主要有两种,第一种是我们新生成了新的特征,想要把它和旧的特征合并在一起.第二种是我们新获取了一份数据集 ...
- 2020JavaWeb实现文件下载
Servlet实现文件下载: package com.demo.test; import org.apache.commons.io.IOUtils; import javax.servlet.Ser ...
- springboot2.x基础教程:Swagger详解给你的接口加上文档说明
相信无论是前端还是后端开发,都或多或少地被接口文档折磨过.前端经常抱怨后端给的接口文档与实际情况不一致.后端又觉得编写及维护接口文档会耗费不少精力,经常来不及更新.其实无论是前端调用后端,还是后端调用 ...
- C# 获取当前月的月初和月末
/// <summary> /// 获取当前月的月末日期 /// </summary> /// <returns></returns> public s ...
- 截图还在使用QQ的Ctrl + Alt + A 截图?还不会网页长截图?
截图还在使用QQ的Ctrl + Alt + A 截图?还不会网页长截图? 手机自带快捷键,常常使用组合键进行快速截图编辑发好友.保存等,但是貌似到了电脑截图就出现了一大堆拍屏幕党,不少人需要打开微 ...
- websocket劫持
WebSockets who is WebSockets? WebSockets是一个能够给单TCP连接提供全双工信道的HTML5特性. 它的持续性连接功能,使得构建B/S模式的实时应用成为可能. W ...
- TKE基于弹性网卡直连Pod的网络负载均衡
前言 Kubernetes在集群接入层设计并提供了两种原生资源Service和Ingress,分别负责四层和七层的网络接入层配置. 传统的做法是创建Ingress或LoadBalancer类型的Ser ...