骗分过样例,提交RE,求看
查看原帖
骗分过样例,提交RE,求看
215698
miker楼主2021/11/22 17:20
#include<bits/stdc++.h>
using namespace std;
const int N=50001,M=50001*2;

int n,m,q,ans,t;
int pos;
int to[6][M],h[6][N],nxt[6][M],tot,op[6][M];

int lv[6][N],c[6][N];
bool b[N];
bool v[6][M];
bool d[M];
int di(int x,int y){
	return (x-1)*m+y;
}
void add(int x,int y,int z){
	to[t][++tot]=y;
	op[t][tot]=z;
	nxt[t][tot]=h[t][x];
	h[t][x]=tot;
}
void dfs(int co,int l,int x,int pah){
	d[x]=1;
	for(int i=h[t][x];i;i=nxt[t][i]){
		int y=to[t][i];
		if((pah>0&&pah!=op[t][i])||b[y]) continue;
		if(lv[t][y]){
			if(lv[t][y]<=l&&co!=c[t][y]){
			if(!b[y]) ans++;
				b[y]=1;
				continue;
			}
			b[y]=1;
			continue;
		}
		
		if(v[op[t][i]][y]) continue;
		if(!d[y]) ans++;
		d[y]=v[op[t][i]][y]=1;
		
		if(op[t][i]!=1) dfs(co,l,y,op[t][i]);
		
	}
}
int main(){
//	freopen("chess.in","r",stdin);
//	freopen("chess.out","w",stdout);
	scanf("%d",&t);
	while(t){
		t--;
		scanf("%d%d%d",&n,&m,&q);
	
	for(int i=1;i<=n;i++){
		getchar();
		for(int j=1;j<=m-1;j++){
			
			char ch=getchar();
			if(ch!='0'){
				add(di(i,j),di(i,j+1),ch-'0');
				add(di(i,j+1),di(i,j),ch-'0');
			}
		}
	}
	for(int i=1;i<=n-1;i++){
		getchar();
		for(int j=1;j<=m;j++){
			char ch=getchar();
			if(ch=='2') ch='4'; 
			if(ch!='0') {
				add(di(i,j),di(i+1,j),ch-'0');
				add(di(i+1,j),di(i,j),ch-'0');
			}
		}
	}
	
	for(int i=1,x,y,l,co;i<=q;i++){
		memset(v,0,sizeof(v));
		memset(d,0,sizeof(d));
		memset(b,0,sizeof(b));
		ans=0;
		scanf("%d%d%d%d",&co,&l,&x,&y);
		dfs(co,l,di(x,y),-1);
		printf("%d\n",ans);
		lv[t][di(x,y)]=l;
		c[t][di(x,y)]=co;
	}
	}
	
	return 0;
	
}
2021/11/22 17:20
加载中...