样例 33%AC,结果 100 分,求求问题在哪里
查看原帖
样例 33%AC,结果 100 分,求求问题在哪里
241114
灰鹤在此楼主2022/11/8 19:27
#include<bits/stdc++.h>
using namespace std;
#define all(x) x.begin(),x.end()
#define siz(x) ((int)x.size())
#define pb push_back
#define fi first
#define se second
const int N=105;
__int128 INT128_MAX=1145141919810;
int n,m,k,tx,ty,a[N][N];
struct Bacteria{
	int x,y,direct;
	int dis[4],len;
}b[5];
int id[N][N][4],ID;
struct OPPO{
	int x,y,direct;
}op[N*N*4];
int to[N*N*4];
string s;
int dis[N*N*4];
inline void dfs(int x,int step,int p){
	if(~dis[x]){b[p].len=step-dis[x];return ;}
	dis[x]=step;
	auto [X,Y,D]=op[x];
	if(X==tx&&Y==ty)b[p].dis[D]=step;
	int To=to[x];
	dfs(To,step+1,p);
}
struct Mod{
	__int128 val,mod;
};
vector<Mod>h;
inline __int128 exgcd(__int128 A,__int128 B,__int128&x,__int128&y){
	if(B==0){x=1,y=0;return A;}
	__int128 D=exgcd(B,A%B,y,x);
	y-=A/B*x;
	return D;
}
inline __int128 exCRT(){
	__int128 lcm=h[0].mod,ans=h[0].val%h[0].mod;
	for(int i=1;i<k;i++){
		__int128 g=(h[i].val%h[i].mod-ans%h[i].mod+h[i].mod)%h[i].mod;
		__int128 x,y,d=exgcd(lcm,h[i].mod,x,y);
		if(g%d)return INT128_MAX;
		x*=(g/d)%(h[i].mod/d);
		ans+=x*lcm;
		lcm=lcm*h[i].mod/d;
		ans=(ans%lcm+lcm)%lcm;
	}
	ans=(ans%lcm+lcm)%lcm;
	for(auto [val,mod]:h)while(ans<=val)ans+=lcm;
	return ans;
}
int main(){
	INT128_MAX*=INT128_MAX;
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	cin>>n>>m>>k>>tx>>ty;
	for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)for(int l=0;l<4;l++)id[i][j][l]=++ID,op[ID]={i,j,l};
	for(int t=0;t<k;t++){
		cin>>b[t].x>>b[t].y>>s;
		if(s[0]=='U')b[t].direct=0;
		if(s[0]=='R')b[t].direct=1;
		if(s[0]=='D')b[t].direct=2;
		if(s[0]=='L')b[t].direct=3;
		for(int i=1;i<=n;i++){
			cin>>s;
			for(int j=1;j<=m;j++)a[i][j]=s[j-1]-'0';
		}
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
				for(int l=0;l<4;l++){
					int nxt=(l+a[i][j])%4;
					if(i==1&&nxt==0)nxt=2;
					if(i==n&&nxt==2)nxt=0;
					if(j==1&&nxt==3)nxt=1;
					if(j==m&&nxt==1)nxt=3;
					int fx=i,fy=j;
					if(nxt==0)fx--;
					if(nxt==1)fy++;
					if(nxt==2)fx++;
					if(nxt==3)fy--;
					to[id[i][j][l]]=id[fx][fy][nxt];
				}
			}
		}
		memset(dis,-1,sizeof(dis));memset(b[t].dis,-1,sizeof(b[t].dis));
		dfs(id[b[t].x][b[t].y][b[t].direct],0,t);
	}
	__int128 ans=INT128_MAX;
	for(int i=0;i<(1<<(2*k));i++){
		h.clear();
		bool flag=1;
		for(int j=0;j<k;j++){
			int w=(i>>(2*j))&3;
			if(b[j].dis[w]==-1){flag=0;break;}
			h.pb({b[j].dis[w],b[j].len});
		}
		if(flag)ans=min(ans,exCRT());
	}
	if(ans==INT128_MAX)cout<<"-1\n";
	else cout<<((long long)ans+1)<<"\n";
	return 0;
}
2022/11/8 19:27
加载中...