求教卡常,悬赏关注
查看原帖
求教卡常,悬赏关注
389729
BantM楼主2023/9/22 17:06

luogu上过了,但是学校OJ上没过被卡了一个点,MnZn真的卡不动了

TLE on 2004ms/2000ms

#include<bits/stdc++.h>
using namespace std;
const int maxn=40005;
int n,a[maxn],m;
vector<int>v[maxn];
int t;
int march[maxn];
bool mark[maxn];
int num;
int ans;
string s;
int g[maxn];
int dx[9]={0,-1,-2,+1,+2,-1,-2,+1,+2};
int dy[9]={0,-2,-1,-2,-1,+2,+1,+2,+1};
inline int id(int aa,int bb){
	return (aa-1)*n+bb;
}
bool sp(int x){
	for(int i=0;i<v[x].size();i++){
		int to=v[x][i];
		if(mark[to]){
			continue;
		}
		mark[to]=1;
		if(march[to]==-1||sp(march[to])){
			march[to]=x;
			return true;
		}
	}
	return false;
}
signed main(){
	scanf("%d",&n);
	for(register int i(1);i<=n;i++){
		cin>>s;
		for(int j=0;j<s.size();j++){
			if(s[j]=='0'){
				g[id(i,j+1)]=1;
				num++; 
			}
			else{
				g[id(i,j+1)]=0;
			}
		}
	}
	for(register int i(1);i<=n;i++){
		for(register int j(1);j<=n;j++){
			if(g[id(i,j)]&&!((i+j)&1)){
				for(int k=1;k<=8;k++){
					int nx=i+dx[k];
					int ny=j+dy[k];
					if(nx>=1&&nx<=n&&ny>=1&&ny<=n&&g[id(nx,ny)]){
						v[id(nx,ny)].push_back(id(i,j));
						v[id(i,j)].push_back(id(nx,ny));
					}
				}
			}
		}
	}
	memset(march,-1,sizeof(march));
	for(register int i(1);i<=n;i++){
		for(register int j(1);j<=n;j++){
			memset(mark,0,sizeof(mark));
			if(!((i+j)&1)&&g[id(i,j)]){
				if(sp(id(i,j))){
					ans++;
				}
			}
		}
	}
	printf("%d",num-ans);
}
2023/9/22 17:06
加载中...