社区讨论

求调WA#4-#11

P3355骑士共存问题参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mj2t5c3e
此快照首次捕获于
2025/12/12 19:52
3 个月前
此快照最后确认于
2025/12/14 12:10
3 个月前
查看原帖
CPP
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=200*200+5000;
int n,m,s,road[N],ans,t[N],tot,v,w,k[N],ans1;
int dx[10]={0,2,1,2,-1,1,-2,-1,-2};
int dy[10]={0,1,2,-1,2,-2,1,-2,-1};
vector<int>st[N];
void f(int k)
{
	int as=0;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			if((i+j)%2==k&&t[i*n-n+j]==0)
			{
				for(int l=1;l<=8;l++)
				{
					int ax=i+dx[l],ay=j+dy[l];
					if(ax>=1&&ay>=1&&ax<=n&&ay<=n)
					{
						if(t[ax*n-n+ay]==0) st[i*n-n+j].push_back(n*ax-n+ay);
					}
				}
			}
		}
	}
}
int find(int x)
{
	for(int i:st[x])
	{
		if(!road[i])
		{
			road[i]=1;
			if(k[i]==0||find(k[i]))
			{
				k[i]=x;
				return true;
			}
		}
	}
	return false;
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		int x,y;
		cin>>x>>y;
		t[x*n-n+y]=1;
	}
	f(0);
	for(int i=1;i<=n*n;i++)
	{
		if(t[i]==0&&(i/n+i-i/n*n+1)%2==0)
		{
			memset(road,0,sizeof road);
			if(find(i)) ans++;	
		}
	}
	cout<<n*n-m-ans;
	
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...