题目传送门: http://acm.hdu.edu.cn/showproblem.php?pid=5821
题意:给我们一个初始序列和目标序列,然后给m次操作,每次操作能修改从l到r的球的位置,问m次操作后能否得到最终序列。
我们可以先将目标序列每个数的出现顺序和初始序列做一个映射,然后对于每次操作,在操作区间内排序,看最后得到的序列是否是1到n就可以了。
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
const int MAXN=1024;
using namespace std;
int a[MAXN],b[MAXN];
int l[MAXN],r[MAXN];
bool vis[MAXN];
using namespace std;
void solve()
{
int n,m;
memset(vis,true,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]);
}
for(int i=1;i<=m;i++)
{
scanf("%d %d",&l[i],&r[i]);
}
for(int i=1;i<=n;i++)
{
bool is=false;
for(int j=1;j<=n;j++)
{
if(a[i]==b[j]&&vis[j])
{
a[i]=j;
vis[j]=false;
is=true;
break;
}
}
if(!is)
{
puts("No");//如果匹配不到,则一定不行
return ;
}
}
for(int i=1;i<=m;i++)
{
sort(a+l[i],a+r[i]+1);
}
int fl=0;
for(int i=1;i<=n;i++)
{
if(a[i]!=i)
{
fl=1;
puts("No");
return ;
}
}
if(!fl)
{
puts("Yes");
return ;
}
return ;
}
int main (void)
{
int t;
cin>>t;
while(t--)
{
solve();
}
return 0;
}