提交时间:2024-02-26 13:38:46

运行 ID: 26792

#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define pi pair<int,int> #define m_p make_pair #define p1 first #define p2 second #define p_b push_back using namespace std; typedef long long ll; inline ll read(){ ll x=0;short t=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } int n,m,K,dp[4005][4005]; vector<int>A[4005],B[4005]; void slv(){ n=read(),m=read(),K=read(); up(i,1,n)A[read()].p_b(i); up(i,1,m)B[read()].p_b(i); up(i,1,K)A[i].p_b(n+1),B[i].p_b(m+1); memset(dp,-1,sizeof(dp)); queue<pi>q;q.push(m_p(0,0)); dp[0][0]=0; while(!q.empty()){ int i=q.front().p1,j=q.front().p2;q.pop(); up(k,1,K){ int ni=*upper_bound(A[k].begin(),A[k].end(),((i<=n)?i:(i-1))); int nj=*upper_bound(B[k].begin(),B[k].end(),((j<=m)?j:(j-1))); if(dp[ni][nj]!=-1)continue; dp[ni][nj]=dp[i][j]+1; q.push(m_p(ni,nj)); if(ni==n+1&&nj==m+1){ printf("%d\n",dp[ni][nj]); return; } // if(dp[i][j]+1==dp[ni][nj])cout<<ni<<' '<<nj<<' '<<dp[ni][nj]<<' '<<i<<' '<<j<<'\n'; } } }int main(){ slv(); fclose(stdin); fclose(stdout); return 0; }