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

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

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

正片\(:\)

  • 类比\([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. Copy a Xaml object

    <Control.Resources> <Button Click="Button_OnClick" x:Key="MyButton"> ...

  2. Unity游戏资源反解工具

    https://github.com/ata4/disunity http://devxdevelopment.com/UnityUnpacker 链接:https://pan.baidu.com/s ...

  3. 分布式文件存储:FastDFS简单使用与原理分析

    引言 FastDFS 属于分布式存储范畴,分布式文件系统 FastDFS 非常适合中小型项目,在我接手维护公司图片服务的时候开始接触到它,本篇文章目的是总结一下 FastDFS 的知识点. 用了 2 ...

  4. 安装cnpm设置npm淘宝镜像源

    安装cnpm npm install -g cnpm 验证npm镜像源 npm config get registry 题外话:cnpm和npm区别? cnpm其实就是在npm的基础上将镜像源更换到国 ...

  5. 2vscode user settings

    {   "editor.accessibilityPageSize": 14,   "editor.fontSize": 14,   "editor. ...

  6. python之结合if条件判断和生成随机数的相关知识,完成石头剪刀布的游戏

    程序开始,显示下面提示信息: 请输入:剪刀(0).石头(1).布(2): 用户输入数字0-2中的一个数字,与系统随机生成的数字比较后给出结果信息. 例如:输入0后,显示如下 你的输入为:剪刀(0) 随 ...

  7. 发送post请求

    题目: http://123.206.87.240:8002/post/ Brup抓包 1.修改Get 为 POST 2.添加 Content-Type: application/x-www-form ...

  8. MVC中将枚举类型数据应用到下拉列表中的方法

    例如: public enum ItemTypes   {      Movie = 1,      Game = 2,      Book = 3   }    在MVC2.0中如何将以上枚举类型使 ...

  9. 一起来读官方文档-----SpringIOC(03)

    1.4.依存关系 典型的企业应用程序不坑你只包含单个对象或单个bean.即使是最简单的应用程序,也有一些对象可以协同工作,以呈现最终用户视为一致的应用程序.下一部分将说明如何从定义多个独立的Bean定 ...

  10. [LeetCode]子串的最大出现次数(字符串)

    题目 给你一个字符串 s ,请你返回满足以下条件且出现次数最大的 任意 子串的出现次数: 子串中不同字母的数目必须小于等于 maxLetters . 子串的长度必须大于等于 minSize 且小于等于 ...