题意:
给出N个测试样例,分别给出n个小球,和step个步骤
步骤: 将 给出的 l -> r区间内所有小球自由重组;
问是否可以有实现与目的数组中情况相同的可能
思路:
eg:
初始 1 2 0 1 2
目标 2 0 1 2 1
从头开始 将编号相同的球移动到目标数组中编号相同球的位置
初始-> 1 2 0 1 2
移动到的位置 3 1 2 5 4
目标-> 2 0 1 2 1
要判断能否移动成功,即可将每个去交内下标从小到大排序即可。
最后判断是否符合1 - > n 的条件
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
int a[1050];
int b[1050];
int flag[1050];
int cmp(int x,int y)
{
return x<y;
}
int main()
{
int T;
cin>>T;
while(T--)
{
int n,step;
cin>>n>>step;
for(int i=1;i<=n;i++)
{scanf("%d",&a[i]);
flag[i]=0;}
for(int i=1;i<=n;i++)
{
scanf("%d",&b[i]);
for(int j=1;j<=n;j++)
{
if(a[j]==b[i]&&flag[j]==0)
{
flag[j]=i;
break;
}
}
}
while(step--)
{
int x,y;
scanf("%d%d",&x,&y);
sort(flag+x,flag+y+1,cmp);
}
int i;
for( i=1;i<=n;i++)
{
if(flag[i]!=i)
break;
}
if(i==n+1)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}