版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/readlnh/article/details/52190328
hdu 5821
题意
给定一列球,每种球有一个颜色,同一颜色的球无区别
每次选择一个区间,任意排列其中的球
问是否能从初始的排列变成给定的一个排列
思路
这题其实很水,就是一个简单的排序。。。比赛期间其实想到排序
,然而当时感觉把多余的往后排就好。。然而。。。其实这题因为操作是有顺序的,每次操作都要把位置定下来。而且,很重要的一点,颜色一样的都是没区别的。所以同样颜色的在前面位置的排列完后相对位置完全可以不变,那其实把a按b里面的位置作为关键字排序,然后最后对比一下位置就好了
代码
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
struct aa {
int value;
int id;
bool operator < (const aa &x)const {
return id < x.id;
}
} a[1000 + 10];
int b[1000 + 10];
int main() {
int T;
scanf("%d", &T);
while(T--) {
int n,m;
scanf("%d %d", &n, &m);
memset(a, -1, sizeof(a));
for(int i = 1; i <= n; i++)
scanf("%d", &a[i].value);
for(int i = 1; i <= n; i++) {
scanf("%d", &b[i]);
for(int j = 1; j <= n; j++) {
if(a[j].value == b[i] && a[j].id == -1) {
a[j].id = i;
break;
}
}
}
while(m--) {
int l,r;
scanf("%d %d", &l, &r);
sort(a + l, a + r + 1);
//sort(b + l, b + r + 1);
}
bool flag = true;
for(int i = 1; i <= n; i++)
if(a[i].value != b[i]) {
flag = false;
break;
}
if(flag)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}