jzoj6017. 【GDOI2019模拟2019.2.14】小b爱旅行(线性基)

版权声明:233 https://blog.csdn.net/gmh77/article/details/87383967

题目描述

Description
在这里插入图片描述
Input
在这里插入图片描述
Output
在这里插入图片描述
Sample Input
4 4 1
1 2 1
2 3 2
3 4 4
4 1 8
4
Sample Output
8
4
Data Constraint
在这里插入图片描述

10%

暴力不解释

100%

经过暴力打表观察可以发现,每条合法路径一定是由一条从1出发的链若干个环组成
证明随便画几个图

所有的情况都存下来是不可能的,所以考虑只存所有从1出发的链,把链去重后乘上环所有可能异或的情况
假设q=0
很显然可以暴力+hash

线性基

考虑用一种高效的方法,在O(log x)的空间、O(n log x)的时间内找出一个没有0的集合,且该集合和原集合任意选取一些数异或出的集合相等

实际上方法并不难
设原序列为a[],当前线性基为b[],当前插入的数为x,最高位为i
对于插入的每个数
如果b[i]存在,则x^=b[i],继续
否则b[i]=x,退出

显然线性基大小与x有关,为O(log x)


线性基有一些优美的性质
①有至少一个数时异或的结果不为0
显然
因为最高位两两不同

②异或出的值两两不同
反证法:
如果a1^a2^a3…=an+1^an+2^an+3^…
所以a1^a2^a3^an+1^an+2^an+3^…=0,与①矛盾

③异或出的集合等于原序列异或的集合
观察构建线性基的过程,发现每个b[]都可以被一些a[]所表示,每个a[]也可以被一些b[]所表示
所以a异或出的集合包含b异或出的集合,b异或出的集合也包含a异或出的集合
所以a异或出的集合等于b异或出的集合

④最多只需要选取log x个数就可以异或出所有可能的异或值(jzoj6020)
也就是线性基中最多只有log x种不同的a[]
因为每次加入新的数时可能多一种a[],所以一共是log x种

⑤线性基是满足条件的最小集合
好像网上证明不多所以随便口胡一下
根据归纳法,已经构造了当前最优的线性基b,要新加入一个数x
1.x能被当前线性基中的数表示
那么x经过一番异或之后一定变成0,不会被加进去
2.x不能被当前线性基中的数表示
则x一定能被b和后面一些没有加入的数表示
即x=b…^a…
那么a的某一项=x^b…^a的其余项
可以发现,如果这时加入x,a中的某一项就可以不用加入了
所以不加入肯定不会更优

⑥x是否能被线性基中的数表示,却不能被上面的程序所识别?
显然不可能
证明不会反正就是对的


线性基可以用来解决求xor的集合、构建最大最小的数之类的问题,这里不多讲

正题

先随便找一颗生成树,可以发现有用的环是由一条非树边树上两点之间的链构成,而任意的环都可以由这些有用的环异或而成
所以建dfs树,每次只用考虑返祖边构成的环,求环的值可以用树上前缀和
然后把环的值丢到线性基里,可以求出最小能表示全部值
环的方案就是2线性基大小
暴力求出所有链的情况,在线性基中异或到最小,丢到哈希中去重
如果两条链的异或结果相同,则一条链一定能用另一条链异或上一些环来表示

然后用链的方案*环的方案就是答案
注意图可能不连通


加上了删边,但是没有强制在线,所以倒过来加边
注意每次线性基更新(加上一条返祖边时可能出现新的值)就暴力重构哈希表
因为重构次数不超过log x,暴力求链为O(n),所以总复杂度为
O(n log x)

code

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#define fo(a,b,c) for (a=b; a<=c; a++)
#define fd(a,b,c) for (a=b; a>=c; a--)
#define mod 10000019
using namespace std;

int a[400002][2];
long long a2[400002];
int ls[200001];
int A[400002][2];
long long A2[400002];
long long f[61];
int B[200001];
bool _BZ[200001];
bool bz2[400002];
long long ans[200001];
long long s[200001];
int D[200001];
long long p[61];
int d[200001];
long long hash[mod];
int n,m,q,I,i,j,k,l,len,Tot,x,y;
long long tot;
bool cg;

void New(int x,int y,long long z)
{
	++len;
	a[len][0]=y;
	a[len][1]=ls[x];
	ls[x]=len;
	a2[len]=z;
}

long long get(long long t)
{
	long long s=576460752303423488;
	int i;
	
	fd(i,59,0)
	{
		if (t&s)
		t^=f[i];
		
		s>>=1;
	}
	
	return t;
}

void Hash(long long t)
{
	t=get(t);
	int i=t%mod;
	
	while (hash[i]>-1 && hash[i]!=t)
	i=(i+1)%mod;
	
	if (hash[i]==-1)
	{
		hash[i]=t;
		D[++tot]=i;
	}
}

void clear()
{
	int i;
	
	fo(i,1,tot)
	hash[D[i]]=-1;
	tot=0;
}

void put(long long t)
{
	long long s=576460752303423488;
	int i;
	
	fd(i,59,0)
	{
		if (t&s)
		{
			if (!f[i])
			{
				f[i]=t;
				++Tot;
				cg=1;
				return;
			}
			else
			t^=f[i];
		}
		
		s>>=1;
	}
}

void dfs(int fa,int t)
{
	int i;
	
	for (i=ls[t]; i; i=a[i][1])
	if (a[i][0]!=fa)
	{
		if (!d[a[i][0]])
		{
			d[a[i][0]]=d[t]+1;
			bz2[i]=1;bz2[i^1]=1;
			
			s[a[i][0]]=s[t]^a2[i];
			Hash(s[a[i][0]]);
			
			dfs(t,a[i][0]);
		}
		else
		if (!bz2[i])
		{
			bz2[i]=1;bz2[i^1]=1;
			put(s[t]^s[a[i][0]]^a2[i]);
		}
	}
}

void swap(int &x,int &y)
{
	int z=x;
	x=y;
	y=z;
}

int main()
{
	freopen("travel.in","r",stdin);
	freopen("travel.out","w",stdout);
	
	memset(hash,255,sizeof(hash));
	
	p[0]=1;
	fo(i,1,60)
	p[i]=p[i-1]*2;
	
	len=1;
	scanf("%d%d%d",&n,&m,&q);
	fo(i,1,m)
	scanf("%d%d%lld",&A[i][0],&A[i][1],&A2[i]);
	
	fo(i,1,q)
	{
		scanf("%d",&B[i]);
		_BZ[B[i]]=1;
	}
	
	j=q;
	fo(i,1,m)
	if (!_BZ[i])
	B[++j]=i;
	
	d[1]=1;
	Hash(0);
	
	fd(i,m,1)
	{
		ans[i]=tot*p[Tot];
		cg=0;
		
		I=B[i];
		New(A[I][0],A[I][1],A2[I]);
		New(A[I][1],A[I][0],A2[I]);
		
		x=A[I][0];y=A[I][1];
		if (d[x]>d[y]) swap(x,y);
		
		if (d[y])
		dfs(0,y);
		
		if (cg)
		{
			clear();
			
			fo(j,1,n)
			if (d[j])
			Hash(s[j]);
		}
	}
	
	printf("%lld\n",tot*p[Tot]);
	fo(i,1,q)
	printf("%lld\n",ans[i]);
	
	fclose(stdin);
	fclose(stdout);
	
	return 0;
}

参考资料

https://www.cnblogs.com/vb4896/p/6149022.html
https://blog.csdn.net/qq_36056315/article/details/79819714
https://www.cnblogs.com/vb4896/p/6149022.html

猜你喜欢

转载自blog.csdn.net/gmh77/article/details/87383967