为什么会RE?
查看原帖
为什么会RE?
188879
VioletIsMyLove楼主2020/9/8 22:15

难道是爆出long long的原因?

#include<bits/stdc++.h>
using namespace std;
const char dposs[5]="URDL";
const int w[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
struct ZS{
	int x,y,w;
}a[10][20005];
int n,m,k;
int X,Y;
int b[10],p[10];
int mp[10][55][55];
long long ans=-1;
long long fist[5][10],fr[5][10];
inline int read(){
	int ret=0,f=1;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();}
	while(isdigit(ch)){ret=ret*10+ch-'0';ch=getchar();}
	return ret*f;
}
int check(int x,int y){return x>=1&&x<=n&&y>=1&&y<=m;}
void BFS(int x){
	int now=0;
	while(now<=20000){
		int nxtx=a[x][now].x,nxty=a[x][now].y,nxtw=(a[x][now].w+mp[x][nxtx][nxty])%4;
		if(!check(nxtx+w[nxtw][0],nxty+w[nxtw][1]))nxtw=(nxtw+2)%4;
		a[x][now+1]=(ZS){nxtx+w[nxtw][0],nxty+w[nxtw][1],nxtw};
		now++;
	}
}
int good(long long cval,int i){
	if(fr[p[i]][i]==-1)return cval==fist[p[i]][i];
	if(cval<fist[p[i]][i])return 0;
	return ((fist[p[i]][i]-cval)%fr[p[i]][i])==0;
}
long long gcd(long long a,long long b){return !b?a:gcd(b,a%b);}
long long solve(){
	long long cval=-1;
	for(int i=1;i<=k;i++){
		if(fist[p[i]][i]==-1)return -1;
		if(fr[p[i]][i]==-1)cval=fist[p[i]][i];
	}
	if(cval!=-1){
		for(int i=1;i<=k;i++)if(!good(cval,i))return -1;
		return cval;
	}
	int hloc=1;
	for(int i=2;i<=k;i++)if(fist[hloc]<fist[i])hloc=i;
	long long Ans=fist[p[hloc]][hloc],mult=fr[p[hloc]][hloc];
	for(int i=1;i<=k;i++){
		if(i==hloc)continue;
		int cnt=0;
		while(Ans%fr[p[i]][i]!=fist[p[i]][i]%fr[p[i]][i]&&cnt<=fr[p[i]][i])cnt++,Ans+=mult;
		if(cnt>fr[p[i]][i])return -1;
		mult*=fr[p[i]][i]/gcd(mult,fr[p[i]][i]);
	}
	return Ans;
}
int main(){
	memset(fist,-1,sizeof fist);memset(fr,-1,sizeof fr);
	n=read();m=read();k=read();X=read();Y=read();
	for(int i=1;i<=k;i++){
		int x=read(),y=read();char ch=getchar();
		for(int j=0;j<=3;j++)if(dposs[j]==ch)b[i]=j;
		a[i][0]=(ZS){x,y,b[i]};
		for(int j=1;j<=n;j++){getchar();
		for(int k=1;k<=m;k++)mp[i][j][k]=(getchar()-'0')%4;}
	}
	for(int i=1;i<=k;i++)BFS(i);
	for(int i=1;i<=k;i++){
		for(int f=0;f<=3;f++)
		for(int j=0;j<=20000;j++)if(a[i][j].x==X&&a[i][j].y==Y&&a[i][j].w==f)fr[f][i]=fr[f][i]==-1?(fist[f][i]==-1?-1:j-fist[f][i]):fr[f][i],fist[f][i]=fist[f][i]==-1?j:fist[f][i];
	}
	for(int s=0;s<=1<<(2*k);s++){
		int temp=s;
		for(int i=1;i<=k;i++)p[i]=temp%4,temp/=4;
		long long cnt=solve();
		if(cnt==-1)continue;
		ans=ans==-1?cnt:min(ans,cnt);
	}
	printf("%lld",ans==-1?-1:ans+1);
	return 0;
}

2020/9/8 22:15
加载中...