为什么这么写都能过
查看原帖
为什么这么写都能过
912241
dream_on_screen楼主2024/4/11 21:18

O((nm)3)O((nm)^3)的代码居然没有超时,而且也没有使用bitset之类的优化

#include <iostream>
using namespace std;
int n,m,a[1616][1616];
int getid(int u,int v)
{
	return (u-1)*m+v;
}
bool safe(int u,int v)
{
	return (u>=1&&u<=n&&v>=1&&v<=m);
}
int ans[1616];
void gauss()
{
	int last=getid(n,m);
	for(int i=1;i<=last;i++)
	{
		for(int j=i;j<=n*m;j++)
			if(a[j][i]>0)
			{
				swap(a[i],a[j]);
				break;
			}
		if(!a[i][i])
			ans[i]=1;
		for(int j=i+1;j<=last;j++)
			if(a[j][i]==1)
			{
				for(int k=1;k<=last;k++)
					a[j][k]^=a[i][k];
			}
	}
	for(int i=last;i>=1;i--)
		for(int j=i+1;j<=last;j++)
			ans[i]^=(ans[j]*a[i][j]);
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
		{
			a[getid(i,j)][getid(i,j)]=1;
			int dx[5]={0,1,-1,0,0},dy[5]={0,0,0,1,-1};
			for(int k=1;k<=4;k++)
				if(safe(i+dx[k],j+dy[k]))
					a[getid(i,j)][getid(i+dx[k],j+dy[k])]=1;
		}
	gauss();
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
			cout<<ans[getid(i,j)]<<" ";
		cout<<"\n";
	}
	return 0;
}
2024/4/11 21:18
加载中...