传送门:HDU5821
题意:有N个盒子,每个盒子最多装一个球. 球的颜色不一定相同.现在要进行m次区间操作:
每次操作将[l, r]区间内的球拿出来后,再随意将区间内的球重新分配回去.
问经过上述操作后是否有可能达到给定的状态.
思路:先贪心的给每个球在b数组中找个位置,然后每次选一个区间就相当于对这个区间排序,使得每个球朝其位置方向去,最后判断一下是不是每个球都在目标位置上就行了。
代码:
#include<bits/stdc++.h>
#define ll long long
#define pi acos(-1)
#define MAXN 1010
#define inf 0x3f3f3f3f
using namespace std;
typedef pair<int,int>P;
P a[MAXN];
int main()
{
int T, n, m, t, l, r;
cin >> T;
while(T--)
{
scanf("%d %d", &n, &m);
for(int i = 1; i <= n; i++)
scanf("%d", &a[i].second), a[i].first = 0;
for(int i = 1; i <= n; i++)
{
scanf("%d", &t);
for(int j = 1; j <= n; j++)
if(a[j].first == 0 && a[j].second == t)
{
a[j].first = i;
break;
}
}
while(m--)
{
scanf("%d %d", &l, &r);
sort(a + l, a + r + 1);
}
bool flag = 0;
for(int i = 1; i <= n; i++)
{
if(a[i].first != i) flag = 1;
}
if(flag) cout << "No\n";
else cout << "Yes\n";
}
return 0;
}