这题很迷。。。
先参考大佬的博客:
https://blog.csdn.net/yuanjunlai141/article/details/52185900
谜点重重啊:
我写了两份代码,一模一样,一份能过,一份不能过,请各位大佬指点一下:
正确代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int M =2010;
int a[M],b[M];
int l[M],r[M];
bool used[M];
int mp[M];
bool Judge(int n)
{
int i;
for(i=1;i<=n;i++)
if(mp[i]!=i)
return false;
return true;
}
int main()
{
int i,j;
int t,n,m;
scanf("%d",&t);
while (t--){
scanf("%d%d",&n,&m);
for (i=1 ; i<=n ; i++){
scanf("%d",&a[i]);
}
for (i=1;i<=n;i++)
scanf("%d",&b[i]);
memset(used,0,sizeof(used));
memset(mp,0,sizeof(mp));
memset(l,0,sizeof(l));
memset(r,0,sizeof(r));
for(i=1;i<=m;i++)
scanf("%d%d",&l[i],&r[i]);
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(a[i]==b[j]&&!used[j])
{
mp[i]=j;
used[j]=true;
//mp[i]=j;
break;
}
}
}
for(i=1;i<=m;i++)
sort(mp+l[i],mp+r[i]+1);
if (!Judge(n)) puts("No");
else puts("Yes");
}
return 0;
}
错误代码:
//J
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define MAXN 2010
int A[MAXN],B[MAXN];
int L[MAXN],R[MAXN];
bool used[MAXN];
int mp[MAXN];
bool Judge(int n)
{
int i;
for(i=1;i<=n;i++)
if(mp[i]!=i)
return false;
return true;
}
int main()
{
int i,j;
int kase;
int n,m;
scanf("%d",&kase);
while(kase--)
{
memset(A,0,sizeof(A));
memset(B,0,sizeof(B));
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
scanf("%d",&A[i]);
for(i=1;i<=n;i++)
scanf("%d",&B[i]);
memset(L,0,sizeof(L));
memset(R,0,sizeof(R));
for(i=1;i<=m;i++)
scanf("%d%d",&L[i],&R[i]);
memset(used,0,sizeof(used));
memset(mp,0,sizeof(mp));
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(A[i]==B[j]&&!used[j])
{
used[j]=true;
mp[i]=j;
break;
}
}
}
for(i=1;i<=m;i++)
sort(mp+L[i],mp+R[i]+1);
if(!Judge(n))
printf("%s\n","NO");
else
printf("%s\n","YES");
}
return 0;
}