题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5821
贪心,就是每次移动都要接近终点一些,所以首先要把每个点的终点位置给找出来代替原来数组中的数字,然后操作时就对[l,r]区间数的终点位置从小到大进行排序就可以了,最后判断是否为a[i] = i。
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int t,n,m,a[1010],b[1010],vis[1010];
bool cmp(int a,int b)
{
return a<b;
}
int main()
{
cin>>t;
while(t--)
{
int flag = 1;
memset(vis,0,sizeof vis);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
scanf("%d",&b[i]);
int i,j;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(vis[j]||a[i]!=b[j])
continue;
a[i] = j;
vis[j] = 1;
break;
}
if(j==n+1)
flag = 0;
}
while(m--)
{
int l,r;
scanf("%d%d",&l,&r);
sort(a+l,a+r+1,cmp);
}
for(int i=0;i<n;i++)
{
if(a[i]!=i)
flag = 0;
}
if(flag)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}