Codeforces 724 G Xor-matic Number of the Graph 线性基+DFS
G. Xor-matic Number of the Graph
http://codeforces.com/problemset/problem/724/G
题意:给你一张无向图。定义一个无序三元组(u,v,s)表示u到v的(不一定为简单路径)路径上xor值为s。求出这张无向图所有不重复三元组的s之和。1≤n≤10^5,1≤m≤2*10^5。
想法:
如果做过【Wc2011 xor】这道题目(题解),那么问题变得简单起来了。
①假设我们钦定一个(u,v),设任意一条u->v的路径xor值为X,该连通图所有小环xor值构成的序列为{Ai}。
那么(u,v)的所有路径的xor值可以由X xor {Ai}的子集xor值得到。于是一个(u,v)的 s 之和变成了求X xor{Ai}的子集可以得到多少个不同的数,这些不同的数的和是多少?
如果能知道{Ai}的子集xor值的值域,那么好办了。于是用线性基得到值域{T}。求和的话,按位考虑定义S(i)为{T}中第i为1的个数,为0的个数取个补集就好了。
对于一个(u,v):

②考虑所有的无序点对(u,v)的答案。上面说过任意一条u->v的路径都可以,不如就钦定是DFS遍历得到DFS树的树上路径。
树上两点路径xor值的求法很简单:设dis(i)表示第i个到根节点路径xor值。
dis(a,b)=dis(a) xor dis(lca(a,b)) xor dis(b) xor dis(lca(a,b))=dia(a) xor dis(b)。
根据上面求ans 的式子,ans只与X的第j位是什么有关,所以设cnt(i)表示两点路径xor值第i位为1的个数。cnt(i)可以利用上面dis(a,b)=dia(a) xor dis(b)求。
对于所有(u,v):

于是解决了。
#include<cstdio>
#include<vector>
#define ll long long
const int len(),MP();
struct Node{int nd;ll co;};
std::vector<Node>Edge[len+];
int n,m,u,v,top,ans,much,vis[len+];
ll sum,S[],cnt[],now[];//cnt(i) 统计 i-th =0的个数 now(i):dx^dy i-th==1的个数
ll st[len+],dis[len+],All,t;
struct Base_Linear
{
ll p[];int size;
void ins(ll x)
{
for(int j=;j>=;j--)
if((x>>j)&)
{
if(p[j])x^=p[j];
else {p[j]=x;size++;break;}
}
}
}BL;
template <class T>void read(T &x)
{
x=;int f=;char ch=getchar();
while(ch<''||ch>''){f=(ch=='-');ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
x=f?-x:x;
}
ll power(int a,int b)
{
ll t=,y=a;
for(;b;b>>=)
{
if(b&)t=(t*y)%MP;
y=(y*y)%MP;
}
return t;
}
void add(int a,int b,ll c){Edge[a].push_back((Node){b,c});}
void plus(ll x)
{
for(int j=;j<=;j++)
if(((x>>j)&)==)cnt[j]++;
}
void Dfs(int x)
{
much++; vis[x]=; plus(dis[x]); st[++top]=dis[x];
for(int v=,sz=Edge[x].size();v<sz;v++)
{
Node y=Edge[x][v];
if(vis[y.nd])BL.ins(dis[x]^dis[y.nd]^y.co);
else
{
dis[y.nd]=dis[x]^y.co;
Dfs(y.nd);
}
}
}
void Back()
{
for(int j=;j<=;j++)cnt[j]=now[j]=S[j]=;
for(int j=;j<=;j++)BL.p[j]=; BL.size=;
much=; All=;
}
void Total()
{
for(;top;top--)
{
for(int j=;st[top];j++,st[top]>>=)
if(st[top]&)now[j]=(now[j]+cnt[j])%MP;
}
for(int j=;j<=;j++)All|=BL.p[j];
for(int j=;All;j++,All>>=)
if(All&)S[j]=power(,BL.size-);
All=power(,BL.size); ll C=;
for(int j=;j<=;j++,C<<=,C%=MP)
{
sum=(ll)much*(much-)/;
ll t1=now[j]*(All-S[j])%MP;
ll t2=((sum-now[j])*S[j])%MP;
ans=(ans+C*t1+C*t2)%MP;
}
}
int main()
{
read(n),read(m);
for(int i=;i<=m;i++)
{
read(u),read(v),read(t);
add(u,v,t),add(v,u,t);
}
for(int i=;i<=n;i++)
if(!vis[i])//图可能不连通
{
Back();
Dfs(i);
Total();
}
ans+=ans<?MP:;
printf("%d",ans);
return ;
}
Codeforces 724 G Xor-matic Number of the Graph 线性基+DFS的更多相关文章
- codeforces 1101G (Zero XOR Subset)-less 前缀异或+线性基
题目传送门 题意:给出一个序列,试将其划分为尽可能多的非空子段,满足每一个元素出现且仅出现在其中一个子段中,且在这些子段中任取若干子段,它们包含的所有数的异或和不能为0. 思路:先处理出前缀异或,这样 ...
- 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(线性基)
题目链接 \(Description\) 给定一张带边权无向图.若存在u->v的一条路径使得经过边的边权异或和为s(边权计算多次),则称(u,v,s)为interesting triple(注意 ...
- codeforces 724G - Xor-matic Number of the Graph 线性基+图
题目传送门 题意:给出衣服无向带权图,问有多少对合法的$<u,v,s>$,要求$u$到$v$存在一条路径(不一定是简单路径)权值异或和等于$s$,并且$u<v$.求所有合法三元组的s ...
- 【BZOJ-2115】Xor 线性基 + DFS
2115: [Wc2011] Xor Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 2142 Solved: 893[Submit][Status] ...
- 2115: [Wc2011] Xor (线性基+dfs)
2115: [Wc2011] Xor Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 5714 Solved: 2420 题目链接:https://w ...
- 【BZOJ2115】[Wc2011] Xor 高斯消元求线性基+DFS
[BZOJ2115][Wc2011] Xor Description Input 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si,Ti ...
- bzoj 2115: [Wc2011] Xor【线性基+dfs】
-老是想到最长路上 其实可以这样:把每个环的xor和都存起来,然后任选一条1到n的路径的xor和ans,答案就是这个ans在环的线性基上跑贪心. 为什么是对的--因为可以重边而且是无相连通的,并且对于 ...
- 【题解】 bzoj2115: [Wc2011] Xor (线性基+dfs)
bzoj2115,戳我戳我 Solution: 看得题解(逃,我太菜了,想不出这种做法 那么丢个链接 Attention: 板子别写错了 又写错了这次 \(long long\)是左移63位,多了会溢 ...
随机推荐
- pysam操作sam文件
pysam模块 因为要分析sam文件中序列的情况,因此要对reads进行细分,所以之前想用数据库将sam文件信息存储,然后用sql语句进行分类.后来发现很麻烦,pysam就是一个高效读取存储在SAM ...
- Linux 97个常用命令
ls [选项] [目录名 | 列出相关目录下的所有目录和文件 -a 列出包括.a开头的隐藏文件的所有文件 -A 通-a,但不列出"."和".." -l 列出文件 ...
- 字符串反转reverse
我们有一串字符串,比如: DECLARE @Source VARCHAR(MAX)= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 现想把它反转显示: ZYXWVUTSRQPONMLKJI ...
- Celery异步任务重复执行(Redis as broker)
之前讲到利用celery异步处理一些耗时或者耗资源的任务,但是近来分析数据的时候发现一个奇怪的现象,即是某些数据重复了,自然想到是异步任务重复执行了. 查阅之后发现,到如果一个任务太耗时,任务完成时间 ...
- 【Java】NIO中Channel的注册源码分析
Channel的注册是在SelectableChannel中定义的: public abstract SelectionKey register(Selector sel, int ops, Obje ...
- [Xcode 实际操作]七、文件与数据-(8 )读取和解析Plist文件(属性列表文件)
目录:[Swift]Xcode实际操作 本文将演示如何读取和解析Plist文件,即属性列表文件. 它是用来存储,串行化后的对象的文件. 在项目名称上点击鼠标右键,弹出右键菜单, 选择[New File ...
- [Xcode 实际操作]六、媒体与动画-(7)遍历系统提供的所有滤镜
目录:[Swift]Xcode实际操作 本文将演示系统到底提供了多少滤镜供开发者使用,并了解每个滤镜都有哪些参数需要配置. 在项目导航区,打开视图控制器的代码文件[ViewController.swi ...
- Laravel Model 利用 Macroable 为数据模型添加宏能力
什么是ThinkSNS ? ThinkSNS(简称TS),一款全平台综合性社交系统,为国内外大中小企业和创业者提供社会化软件研发及技术解决方案,目前最新版本为ThinkSNS+(简称TS+).Thin ...
- hp惠普工作站 安装ESXI 从U盘启动黑屏问题
[背景] 公司新买了一套hp z238 workstation需要安装esxi,我按照以前的方法制作好U盘后插入从U盘引导,显示屏一直黑屏,这个问题困扰了我一天....在网上找了好久无果 第二天终于在 ...
- IntelliJ IDEA 打包Maven 构建的 Java 项目
方法 2,一键生成方便到哭 打开maven项目路径 一键生成 3.生成jar 目标文件在 path/target/xx.jar下面 方法 1 选中Java项目工程名称,在菜单中选择 F ...