【BZOJ 2115】 [Wc2011] Xor

2115: [Wc2011] Xor

Time Limit: 10 Sec  Memory Limit: 259 MB

Submit: 962  Solved: 441

[Submit][Status]

Description

Input

第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目。 接下来M 行描述 M 条边,每行三个整数Si,Ti ,Di,表示 Si 与Ti之间存在 一条权值为 Di的无向边。 图中可能有重边或自环。

Output

仅包含一个整数,表示最大的XOR和(十进制结果) 。

Sample Input

5 7

1 2 2

1 3 2

2 4 1

2 5 1

4 5 3

5 3 4

4 3 2

Sample Output

6

HINT

高斯消元。

这道题可以说非常好的利用了异或的性质:a^b^b=a

做法是随便找一条1-n的路径的异或和,然后选择一些环再与这条路径异或,求最大异或值。

为什么可以这样做?

如果某个环有边在这条路径上,那么异或这个环,环上在路径上的边异或了两次,抵消掉了;

如果某个环没有边这条路径上,因为图是连通的,我们从当前的路径走到那个环上一点,走完整个环,再原路返回,路上的权值异或了两次,被抵消掉了。

因此,只要找那些环与这条路径的异或和最大就可以了。

假设我们现在已经求出了每一个环的异或和,怎么求最大?

对所有环进行高斯消元就行了,具体见【bzoj 2844】

那么如何求出每一个环的异或和?

一次dfs就可以实现了,d[i]表示从1-i路径上的异或和。

如果x子节点y被访问过,那么当前一定构成了环。

根据a^b^b=a的性质,这个环的异或和就是d[x]^d[y]^e[k].v  (e[k].v是连接xy的边权)

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
#define LL long long
using namespace std;
int v[100005],cnt=0,tot=0,n,m,h[100005];
LL c[500005],d[100005];
struct edge
{
	int x,y,ne;
	LL v;
}e[500005];
void Addedge(int x,int y,LL v)
{
	tot++;
	e[tot].x=x;
	e[tot].y=y;
	e[tot].ne=h[x];
	e[tot].v=v;
	h[x]=tot;
}
void dfs(int x)
{
	v[x]=1;
	for (int i=h[x];i;i=e[i].ne)
	{
		int y=e[i].y;
		if (!v[y])
		{
			d[y]=d[x]^e[i].v;
			dfs(y);
		}
		else
		{
			LL k=d[y]^d[x]^e[i].v;
			if (k) c[++cnt]=k;
		}
	}
}
LL Gauss()
{
	LL ans=0LL;
	int now=1;
	for (int i=60;i>=0;i--)
	{
		if (now>cnt) break;
		for (int k=now;k<=cnt;k++)
			if (c[k]&(1LL<<(LL)i))
			{
				swap(c[now],c[k]);
		        for (int j=1;j<=cnt;j++)
					if (j!=now&&(c[j]&(1LL<<(LL)i)))
						c[j]^=c[now];
				now++;
				break;
			}
	}
	ans=d[n];
	for (int i=1;i<=cnt;i++)
		if ((ans^c[i])>ans) ans^=c[i];
	return ans;
}
int main()
{
        scanf("%d%d",&n,&m);
	for (int i=1;i<=m;i++)
	{
		int x,y;
		LL v;
		scanf("%d%d%lld",&x,&y,&v);
		Addedge(x,y,v);
		Addedge(y,x,v);
	}
	dfs(1);
	cout<<Gauss()<<endl;
	return 0;
}

感悟:

1.一开始wa了多次,因为我把d[n]也高斯消元了,而d[n]是必须要得!

2.xor的性质a^b^b=a!!!

时间: 2024-10-24 20:56:48

【BZOJ 2115】 [Wc2011] Xor的相关文章

【BZOJ 2115】【WC 2011】Xor

计算1到n的一条路径使得路径上的值xor和最大. 先任意走一条路径计算xor和,然后dfs的时候处理出所有的环的xor和,这样对于所有的环的xor和求线性基,在任意走出的路径的xor和上贪心即可. 正确性显然,如果环与选择的路径有重合,那么重合的部分就会被xor两次,也就没有xor,相当于更改了一部分路径.如果环与选择的路径没有重合,那么相当于从路径上任意一个点到环上的一个点,跑一圈后从进入环的点原路返回,这样环的xor和就计算到了,而往返两次的路径也因为xor了两次相当于没有xor,就不用考虑

【BZOJ 4269】再见Xor

zky学长提供的线性基求法: for(int i=1;i<=n;i++) for(int j=64;j>=1;j--) { if(a[i]>>(j-1)&1) { if(!lb[j]){lb[j]=a[i];break;} else a[i]^=lb[j]; } } Gauss消元求线性基的方法: #include<cstdio> #include<cstring> #include<algorithm> #define read(x)

【BZOJ 2820】 YY的GCD

2820: YY的GCD Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 807  Solved: 404 [Submit][Status] Description 神犇YY虐完数论后给傻×kAc出了一题 给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对 kAc这种傻×必然不会了,于是向你来请教-- 多组输入 Input 第一行一个整数T 表述数据组数 接下来T行,每行两个正整数,表示

【BZOJ 1854】 [Scoi2010]游戏

1854: [Scoi2010]游戏 Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 2609  Solved: 931 [Submit][Status] Description lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备时,他只能使用该装备的某一个属性.并且每种装备最多只能使用一次. 游戏进行到最后,lxhgww遇到了终极boss,这个终极bos

【BZOJ 1036】【ZJOI 2008】树的统计

此题为树链剖分的裸题. 代码如下,使用常用的轻重链剖分. /************************************************************** Problem: 1036 User: Evensgn Language: C++ Result: Accepted Time:2468 ms Memory:5772 kb ****************************************************************/ #inc

【BZOJ 1150】 1150: [CTSC2007]数据备份Backup (贪心+优先队列)

1150: [CTSC2007]数据备份Backup Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游戏的乐趣.已知办公 楼都位于同一条街上.你决定给这些办公楼配对(两个一组).每一对办公楼可以通过在这两个建筑物之间铺设网 络电缆使得它们可以互相备份.然而,网络电缆的费用很高.当地电信公司仅能为你提供 K 条网络电缆,这意味 着你仅

【BZOJ 2823】 [AHOI2012]信号塔

2823: [AHOI2012]信号塔 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 469  Solved: 198 [Submit][Status][Discuss] Description 在野外训练中,为了确保每位参加集训的成员安全,实时的掌握和收集周边环境和队员信息非常重要,集训队采用的方式是在训练所在地散布N个小型传感器来收集并传递信息,这些传感器只与设在集训地中的信号塔进行通信,信号塔接收信号的覆盖范围是圆形,可以接收到所有分布在

【BZOJ 3190】 [JLOI2013]赛车

3190: [JLOI2013]赛车 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 803 Solved: 279 [Submit][Status][Discuss] Description 这里有一辆赛车比赛正在进行,赛场上一共有N辆车,分别称为个g1,g2--gn.赛道是一条无限长的直线.最初,gi位于距离起跑线前进ki的位置.比赛开始后,车辆gi将会以vi单位每秒的恒定速度行驶.在这个比赛过程中,如果一辆赛车曾经处于领跑位置的话(即没有其他

【BZOJ 1146】 [CTSC2008]网络管理Network

1146: [CTSC2008]网络管理Network Time Limit: 50 Sec  Memory Limit: 162 MB Submit: 1938  Solved: 577 [Submit][Status] Description M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路由器和N-1条高速光缆组成.每个部门都有一个专属的路由器,部门局域网内的所有机