样例过不去
查看原帖
样例过不去
305891
Eraine楼主2023/10/3 14:35

rt,0pts求调

#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
using namespace std;
const int N=200;
int n,m,k,match[N*N+5],vis[N*N+5],dix[8]={1,3,3,1,-1,-3,-3,-1},diy[8]={-3,-1,1,3,3,1,-1,-3};
vector<int>E[N*N+5];
bool maxmatch(int u){
	for(int i=0;i<E[u].size();i++){
		int v=E[u][i];
		if(!vis[v]){
			vis[v]=1;
			if(!match[v]||maxmatch(match[v])){
				match[v]=u;
				return 1;
			}
		}
	}
	return 0;
}
bool a[N+5][N+5];
int getId(int x,int y){
	return (x-1)*m+y;
}
void build(int X,int Y){
	if(a[X][Y]||X<1||X>n||Y<1||Y>m){
		return;
	}
	int Id=getId(X,Y);
	for(int i=0;i<8;i++){
		int x=X+dix[i],y=Y+diy[i];
		if(a[x][y]||x<1||x>n||y<1||y>m){
			continue;
		}
		int id=getId(x,y);
		E[Id].push_back(id);
	}
}
int main(){
	scanf("%d%d%d",&n,&m,&k);
	int res=n*m;
	for(int i=1;i<=k;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		if(!a[x][y]){
			res--;
		}
		a[x][y]=1;
	}
	for(int i=1;i<=n;i+=2){
		for(int j=1;j<=m;j++){
			build(i,j);
		}
	}
	for(int i=1;i<=n;i+=2){
		for(int j=1;j<=m;j++){
			if(!a[i][j]){
				res-=maxmatch(getId(i,j));
			}
		}
	}
	printf("%d\n",res);
	return 0;
}
2023/10/3 14:35
加载中...