请求加强数据。
查看原帖
请求加强数据。
397812
MuronaQwQ楼主2024/8/4 16:37

如以下代码:

#include<bits/stdc++.h>
using namespace std;
#define    int   long long

const int MAXE = 800010;
const int MAXN = 80010;

bool vis[MAXN];
char str[210][210];
int n,k,tot,wzq,sm,x[MAXN],y[MAXN],to[MAXE],nxt[MAXE],head[MAXN],mat[MAXN];
int dx[10]={-1,-2,1,2,-1,-2,1,2};
int dy[10]={-2,-1,-2,-1,2,1,2,1};

inline int id(int x,int y) { return n*(x-1)+y; }

inline void add(int a,int b){
	nxt[++tot]=head[a];
	head[a]=tot;
	to[tot]=b;
}

bool fd(int x){
	for(int i=head[x];i;i=nxt[i]){
		int y=to[i];
		if(vis[y]) continue;
		vis[y]=true;
		if(!mat[y] || fd(mat[y])){
			mat[y]=x;
			return true;
		}
	}
	return false;
}

signed main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		scanf("%s",str[i]+1);
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			sm+=(str[i][j]=='0');
			if(str[i][j]=='0' && i%2==j%2){
				for(int kk=0;kk<8;kk++){
					int xx=i+dx[kk];
					int yy=j+dy[kk];
					if(xx>=1 && xx<=n && yy>=1 && yy<=n && str[xx][yy]!='1'){
						add(id(i,j),id(xx,yy));
					}
				}
			}
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(str[i][j]=='0' && i%2==j%2){
				memset(vis,0,sizeof(vis));
				wzq+=fd(id(i,j));
			}
		}
	}
	cout<<sm-wzq;
}

其中 id 函数误写成以下形式:

inline int id(int x,int y) { return (n-1)*x+y; }

但仍有 80 分。

正确写法为

inline int id(int x,int y) { return (x-1)*n+y; }

改正前记录:link

改正后记录:link

另:在其他 OJ 上的自造数据里改正前的代码会得 0 分。

以下图为更正前后 id 函数的输出结果,左为更正前,右为更正后。

当然,如果我理解上有问题,大佬们也请轻喷qwq

2024/8/4 16:37
加载中...