• 题目就不翻译了吧,应该写的很清楚了。。。

  • 首先 \(,\) 不懂线性基的可以戳这里。知道了线性基\(,\) 但是从来没有写过线性基和图论相结合的\(,\) 可以戳这里

  • 好\(,\) 点完了这些前置技能之后,我们就可以来愉快的切题啦!

正片\(:\)

  • 类比\([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】的更多相关文章

  1. Codeforces 724 G Xor-matic Number of the Graph 线性基+DFS

    G. Xor-matic Number of the Graph http://codeforces.com/problemset/problem/724/G 题意:给你一张无向图.定义一个无序三元组 ...

  2. CF 724 G. Xor-matic Number of the Graph

    G. Xor-matic Number of the Graph 链接 题意: 给定一个无向图,一个interesting的三元环(u,v,s)满足,从u到v的路径上的异或和等于s,三元环的权值为s, ...

  3. 【LeetCode-面试算法经典-Java实现】【136-Single Number(仅仅出现一次的数字)】

    [136-Single Number(仅仅出现一次的数字)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given an array of integers, ev ...

  4. 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 ...

  5. 【年度开源、工具合集】牛津计划,DMTK,Graph Engine…提高你的工作效率!

    本篇合集包括以下三个部分的内容: 1.微软亚洲研究院过去一年的所有开源合集,如分布式机器学习工具包DMTK等. 2.利用微软研究院的技术提高工作效率的工具合集,如让没有机器学习背景的开发人员也能开发出 ...

  6. WCF学习系列一【WCF Interview Questions-Part 1 翻译系列】

    http://www.topwcftutorials.net/2012/08/wcf-faqs-part1.html WCF Interview Questions – Part 1 This WCF ...

  7. 【PC网站前端架构探讨系列】关于中小型PC网站前端架构方案的讨论与实践

    目   录 1.遇到的问题 2.目标 3.探讨 4.架构设想 5.流程 6.初步实现 7.存在问题 8.最后 遇到的问题 我在这个系列上篇文章 已经讲解并开始逐步应用模块化思想,不知大家还记不记得,题 ...

  8. 【Java&Android开源库代码剖析】のandroid-smart-image-view

    Android应用开发已经进入到相对成熟的阶段,特别在国外,涌现出了各式各样的成熟稳定的开源库,供普通开发者使用.这种情况虽然极大加速了app开发的进程,但同时带来的问题是大多数普通开发者在使用这些开 ...

  9. 【Cocos2d-x游戏引擎开发笔记(25)】XML解析

    原创文章,转载请注明出处:http://blog.csdn.net/zhy_cheng/article/details/9128819 XML是一种非常重要的文件格式,由于C++对XML的支持非常完善 ...

随机推荐

  1. Axios拦截器配置

    Axios 拦截器的配置如下 分三块:基础配置.请求之前拦截.响应之前拦截 发送所有请求之前和操作服务器响应数据之前对这种情况过滤. http request 请求拦截器 每次发送请求之前判断是否存在 ...

  2. 用navicat进行身份验证连接出现cannot connect to Mongodb authentication failed

    用navicat进行身份验证连接出现cannot connect to Mongodb authentication failed. 解决办法: 1.打开mongoDB连接 win+r --cmd-- ...

  3. 简单说说TCP三次握手、四次挥手机制

    1.什么是TCP TCP全称Transmission Control Protocol(传输控制协议),是一种面向连接的.可靠的.基于字节流的传输层通信协议.是为了在不可靠的互联网络上提供可靠的端到端 ...

  4. 小程序开发-基础组件icon/text/progress入门

    小程序的基础组件--基础内容 基础内容分为三大组件: 1. icon--图标 index.wxml <view class="group"> <block wx: ...

  5. C016:字符串倒置

    代码: #include "stdafx.h" #include <string.h> int _tmain(int argc, _TCHAR* argv[]) { c ...

  6. python应用 处理excel数据

    实现功能 excel表格中有4列数,分别为RMF计算得到的 β,γ,势能面及组态,需要挑选出相同 β 值下势能面最低时的组态.为了减小数据量,先将 β 值保留两位小数. 代码 import xlrd ...

  7. PHP 类的构造方法 __construct()

    1. 构造方法简介 构造方法 __construct() 是一种类结构特有的特殊方法,该方法由系统规定好 实例化一个类时:先调用该方法,再返回类的对象 构造方法也是普通方法,不同之处就是在实例化类时会 ...

  8. 数据库增量备份,恢复innobackex

    Xtrabackup 一款强大的在线热备工具 备份过程中不锁表,适合生产坏境 Xtrabackup:C程序,支持innodb/xtradb Innobackupex:innodb/mysiam #rp ...

  9. awk使用说明(复制别人的)

    来源:http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html 简介 awk是一个强大的文本分析工具,相对于grep的查找,se ...

  10. FFmpeg开发笔记(五):ffmpeg解码的基本流程详解(ffmpeg3新解码api)

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...