求大佬看看为什么GG
查看原帖
求大佬看看为什么GG
19868
林蔭楼主2020/5/24 14:47

如题,写了三种算法拼接在一起,分别是暴力,完全图的特殊情况,快速幂

#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
#include<cstring>
using namespace std;
vector<int> b[101];
int n,m,q,val[201][201],ques[201],now=0,a1,a2,tot=1,mxsl;
struct Matrix
{
	int n,m,a[201][201];
	inline Matrix(int _n=0,int _m=0): n(_n),m(_m)
	{
		memset(a,0,sizeof a );
	}
	inline Matrix operator = (const Matrix &o)
	{
		n=o.n;
		m=o.m;
		memcpy(a,o.a,sizeof a );
		return *this;
	}
	inline Matrix operator * (const Matrix &o) const
	{
		Matrix ans(n,o.m);
		for(int i=0;i<=n-1;i++)
		{
			for(int k=0;k<=m-1;k++)
			{
				for(int j=0;j<=o.m-1;j++)
				{
					ans.a[i][j]^=a[i][k]*o.a[k][j];	
				}
			}
		}
		return ans;
	}
}F,M[32],ans;
void INIT()
{
	F.n=n;
	M[0].n=n;
	M[0].m=n;
	F.m=1;
}
void Work()
{
	for(int i=1;i<=150;i++)
	{
		for(int j=1;j<=n;j++)
		{
			for(int k=0;k<b[j].size();k++)
			{
				val[j][i]^=val[b[j][k]][i-1];
			}
		}
	}
	if(n%2==1)
	{
		for(int i=1;i<=q;i++)
		{
			scanf("%d",&a1);
			printf("%d\n",val[1][1]);
		}	
	}
	else
	{
		for(int i=1;i<=q;i++)
		{
			scanf("%d",&a1);
			a1=a1%2; 
			printf("%d\n",val[1][a1]);
		}
	}
	return;
}
void Round1()
{
	for(int i=1;i<=150;i++)
	{
		for(int j=1;j<=n;j++)
		{
			for(int k=0;k<b[j].size();k++)
			{
				val[j][i]^=val[b[j][k]][i-1];
			}
		}
	}
	for(int i=1;i<=q;i++)
	{
		printf("%d\n",val[1][ques[i]]);
	}
	return;
}
void Round2()
{
	for(int i=1;i<=31;i++)
	{
		M[i]=M[i-1]*M[i-1];
	}
	for(int i=1;i<=q;i++)
	{
		ans=F;
		for(int bits=0;bits<=31;bits++)
		{
			if((ques[i]>>bits)&1)
			{
				ans=M[bits]*ans;
			}
		}
		cout<<ans.a[0][0]<<endl;
	}
}
int main()
{
	//freopen("magic.in","r",stdin);
	//freopen("magic.out","w",stdout);
	scanf("%d%d%d",&n,&m,&q);
	INIT();
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&val[i][0]);
		F.a[i-1][0]=val[i][0];
	}
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d",&a1,&a2);
		b[a1].push_back(a2);
		b[a2].push_back(a1);
		a1--;
		a2--;
		M[0].a[a1][a2]=M[0].a[a2][a1]=1;
	}
	if(2*m==n*(n-1))
	{
		Work();
		return 0;
	}
	for(int i=1;i<=q;i++)
	{
		scanf("%d",&ques[i]);
		mxsl=max(mxsl,ques[i]);
	}
	if(mxsl<=150)
	{
		Round1();
		return 0;
	}
	else
	{
	 	Round2();
	 	return 0; 
	}
}
2020/5/24 14:47
加载中...