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;
}