啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊,比赛的时候直接读错题了,实力带坑队友。。。。
题意:
有两个序列都代表筐,每个筐里只有一个球,然后序列的值代表筐里的球的颜色,问你在m次操作后,a序列的球能否变成b序列的球,每总操作虽然是收集这个区间所有的球,但是每个筐只能放一个,也就是说这只是交换位置的操作。
思路:
补完题,也完全想不出可以用标记下标,然后对m个区间的a数组下标排序,因为在排序的过程中,就会类似于偏移操作,而且是最优操作哦,然后判断一下就好了。哎,实在想不出来,好厉害的方法,+神题;
挫code……
#include<cstdio>
#include<iostream>
#include<math.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define eps 1e-8
typedef __int64 LL;
const int N=1e3+10;
struct asd{
int id;
int v;
}q[N];
int temp[N];
bool cmp(asd x,asd y)
{
return x.id<y.id;
}
int main()
{
int t;
int n,m;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
{
scanf("%d",&q[i].v);
q[i].id=-1;
}
for(int i=0;i<n;i++)
{
scanf("%d",&temp[i]);
for(int j=0;j<n;j++)
{
if(q[j].v==temp[i]&&q[j].id==-1)
{
q[j].id=i;
break;
}
}
}
int s,t;
while(m--)
{
scanf("%d%d",&s,&t);
sort(q+s-1,q+t,cmp);
}
bool flag=true;
for(int i=0;i<n;i++)
{
if(q[i].v!=temp[i])
{
flag=false;
break;
}
}
if(flag) puts("Yes");
else puts("No");
}
return 0;
}
/*
100
4 1
1 1 0 0
0 0 0 2
1 4
4 2
1 1 0 0
0 0 0 2
1 4
2 4
*/