BZOJ 2115 [Wc2011] Xor

2023-12-05 10:49
文章标签 bzoj xor wc2011 2115

本文主要是介绍BZOJ 2115 [Wc2011] Xor,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

给定边权为非负的无向图,求1到n边权异或和最大的路径(可以重复经过点和边)。
n50000,m100000,0ei1018

PoPoQQQ:
http://blog.csdn.net/popoqqq/article/details/39804075
一条路径的异或和可以化为一条1到n的简单路径和一些简单环的异或和,我们首先DFS求出任意一条1到n的简单路径以及图中所有线性无关的环(线性基)。

度娘:
1.线性基能相互异或得到原集合的所有相互异或得到的值。
2.线性基是满足性质1的最小的集合。
3.线性基没有异或和为0的子集。

用高斯消元求线性基,其结果的特点是最高位单调,且每个数的最高位只出现在这个数上。
(e.g 110,011->101,011)

最后贪心求解即可。

线性基+dfs生成树

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
template<class T>void sc(T &x){int f=1;x=0;char c;while(c=getchar(),c<48)if(c=='-')f=-1;do x=x*10+(c^48);while(c=getchar(),c>47);x*=f;
}
template<class T>void nt(T x){if(!x)return;nt(x/10);putchar('0'+x%10);
}
template<class T>void pt(T x){if(x<0){putchar('-');x=-x;}if(!x)putchar('0');else nt(x);
}
//----------------------------
const int maxn=50004;
const int maxm=100005;int n,m;int last[maxm],ecnt;
struct Edge{int to;ll w;int nxt;
}edge[maxm<<1];
void ins(int u,int v,ll w){edge[++ecnt]=(Edge){v,w,last[u]};last[u]=ecnt;
}ll d[maxm<<1];//*
ll key[maxn];
int tot;
bool vis[maxn];
void dfs(int x){vis[x]=true;for(int i=last[x];i;i=edge[i].nxt){int y=edge[i].to;if(vis[y]){ll t=key[x]^key[y]^edge[i].w;if(t)d[++tot]=t;}else{key[y]=key[x]^edge[i].w;dfs(y);}}
}
void gospoly(){int i,k=0;for(ll t=1ll<<62;t;t>>=1){for(i=k+1;i<=tot;i++)if(d[i]&t)break;if(i>tot)continue;swap(d[++k],d[i]);for(int j=1;j<=tot;j++)if(j!=k&&(d[j]&t))d[j]^=d[k];}
}int main(){sc(n);sc(m);ll w;for(int u,v,i=1;i<=m;i++){sc(u);sc(v);sc(w);ins(u,v,w);ins(v,u,w);}dfs(1);gospoly();ll ans=key[n];for(int i=1;d[i];i++)if((ans^d[i])>ans)ans^=d[i];printf("%lld\n",ans);return 0;
}

这篇关于BZOJ 2115 [Wc2011] Xor的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/457268

相关文章

【BZOJ】1324 Exca王者之剑 最大权独立集

传送门:【BZOJ】1324  Exca王者之剑 题目分析:赤裸裸的最大权独立集。。。最小割解决 代码如下: #include <cstdio>#include <vector>#include <cstring>#include <algorithm>using namespace std ;#define REP( i , a , b ) for ( int

【BZOJ】1026: [SCOI2009]windy数 数位DP

传送门:【BZOJ】1026: [SCOI2009]windy数 题目分析:数位DP水题。 代码如下: #include <stdio.h>#include <cstring>#include <algorithm>#define rep( i , a , b ) for ( int i = a ; i < b ; ++ i )#define For( i ,

【BZOJ】2152: 聪聪可可 点分治

传送门:【BZOJ】2152: 聪聪可可 题目分析:记录权值和%3的路径的个数。。。然后去重。。没了。。 代码如下: #include <vector>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std ;typedef lo

BZOJ 2440 2301 莫比乌斯应用

http://www.lydsy.com/JudgeOnline/problem.php?id=2440 Description 小 X 自幼就很喜欢数。但奇怪的是,他十分讨厌完全平方数。他觉得这些 数看起来很令人难受。由此,他也讨厌所有是完全平方数的正整数倍的数。然而 这丝毫不影响他对其他数的热爱。  这天是小X的生日,小 W 想送一个数给他作为生日礼物。当然他不能送一 个小X讨厌

BZOJ 3732: Network(最小生成树+倍增)

题目链接 题意:给出一个图,每个询问的格式是:A B,表示询问从A点走到B点的所有路径中,最长的边最小值是多少 很明显最终查询的边一定是在最小生成树里面的,先跑出最小生成树,然后,可以树链剖分,也可以使用倍增来计算 #include<bits/stdc++.h>using namespace std;#define cl(a,b) memset(a,b,sizeof(a))#define

ABC367G-Sum of (XOR^K or 0)

第一次学会多项式的题目。 题意: n n n个数的多重集 S S S,设 S ′ ⊆ S , f ( A ) = [ ∣ A ∣ = t m , t ∈ Z ] ( X O R a i ∈ a a i ) k S' \subseteq S,f(A)=[|A| =tm,t\in Z](XOR_{a_i\in a}ai)^k S′⊆S,f(A)=[∣A∣=tm,t∈Z](XORai​∈a​ai)k

E - Xor Distances

树和 xor 有些地方 很契合🔥。。 比如树上距离。。很容易想到减去lca公共的那段。 而xor 他异或 刚好也是会抵消公共部分的。。。 题目链接 #include <bits/stdc++.h>using namespace std;#define int long long#define ll __int128_t#define ar array<int, 2>#define a

buuctf [MRCTF2020]Xor

前言:学习笔记。 32位IDA 打开。 先查找字符串 ok,反汇编不了,好吧,只能看汇编代码。 那咱用OD去做。顺便复习汇编语言 接着往下。 没看懂?那把JNZ SHORT xor.00CE10FF 给NOP掉再看看。 再走一遍。 猜测AL是否代表的是下标? CL是对应值?不确定,再走一遍。 OK,结案,程序是对应值与对应下

BZOJ 2038 小Z的袜子(hose) (莫队离线)

题目地址:BZOJ 2038 裸的莫队算法。 代码如下: #include <iostream>#include <string.h>#include <math.h>#include <queue>#include <algorithm>#include <stdlib.h>#include <map>#include <set>#include <stdio.h>#in

BZOJ 2152 聪聪可可 (树上点分治)

题目地址:BZOJ 2152 找有多少对权值和为3的倍数的点。最简单的点分治。 代码如下: #include <iostream>#include <string.h>#include <math.h>#include <queue>#include <algorithm>#include <stdlib.h>#include <map>#include <set>#incl