社区讨论
求调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 条回复,欢迎继续交流。
正在加载回复...