description:
- 給定一個長度爲 的序列 。
- 再給定一個長度爲 的序列 。
- 對於每一個 ,你都可以選擇將 和 交換位置,使用次數不限。
- 詢問你能否找到一種方案,使得序列滿足 ,輸出
YES
或NO
即可。 - 多組數據,數據組數不超過 ,,,。
- translate by @ShineEternal。
solution:
其實我們可以把 看成一個個傳送帶。
首先如果有 ,那麼任何情況都能傳送,也就是說一定有解。
否則的話,我們可以先把傳送帶排序。
然後這時候傳送帶可能會有連成一塊一塊的。(即連續自然數列)
那麼同一塊的我們可以隨便排序,直接 即可。
每一塊傳送帶都這麼操作,最後對 數組進行單調性判斷。
code:
#include<cstdio>
#include<algorithm>
using namespace std;
int a[105],p[105];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
for(int i=1;i<=m;i++)
{
scanf("%d",&p[i]);
}
sort(p+1,p+m+1);
if(m==n-1)
{
printf("YES\n");
continue;
}
int tmpl=p[1],tmpr=p[1]+1;
for(int i=2;i<=m;i++)
{
if(p[i]>p[i-1]+1)
{
sort(a+tmpl,a+tmpr+1);
tmpl=p[i];
tmpr=p[i]+1;
}
else
{
tmpr++;
}
}
sort(a+tmpl,a+tmpr+1);
int flag=0;
for(int i=2;i<=n;i++)
{
if(a[i]<a[i-1])
{
flag=1;
break;
}
}
if(flag==0)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
return 0;
}