题解:
假设有4个红球,初始时从左到右标为1,2,3,4。那么肯定存在一种方案,使得最后结束时红球的顺序没有改变,也是1,2,3,4。 那么就可以把同色球都写成若干个不同色球了。所以现在共有n个颜色互异的球。按照最终情况标上1,2,。。,n的序号,那么贪心的来每次操作就是把一个区间排序就行了。
好蠢啊,想了半天也没想出来。
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <deque>
#include <cmath>
#include <vector>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define L(i) i<<1
#define R(i) i<<1|1
#define INF 0x3f3f3f3f
#define pi acos(-1.0)
#define eps 1e-9
#define maxn 100010
#define MOD 1000000007
int cnt[1010];
int n,m;
int a[1010],b[1010];
int aa[1010],bb[1010];
int main()
{
int T,C = 1;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(int i = 0; i < n; i++)
{
scanf("%d",&a[i]);
aa[i] = a[i];
}
for(int i = 0; i < n; i++)
{
scanf("%d",&b[i]);
bb[i] = b[i];
}
sort(aa,aa+n);
sort(bb,bb+n);
int flag = 1;
for(int i = 0; i < n; i++)
if(aa[i] != bb[i])
flag = 0;
int vis[1010] = {0};
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
{
if(a[i] == b[j] && !vis[j])
{
cnt[i] = j;
vis[j] = 1;
break;
}
}
while(m--)
{
int x,y;
scanf("%d%d",&x,&y);
sort(cnt+x-1,cnt+y);
}
for(int i = 0; i < n; i++)
if(cnt[i] != i)
flag = 0;
if(!flag)
printf("No\n");
else
printf("Yes\n");
}
return 0;
}