CF1311B. WeirdSort題解

description:

  • 給定一個長度爲 nn 的序列 aia_i
  • 再給定一個長度爲 mm 的序列 pip_i
  • 對於每一個 pip_i,你都可以選擇將 apia_{p_i}api+1a_{p_i+1} 交換位置,使用次數不限。
  • 詢問你能否找到一種方案,使得序列滿足 a1a2a3...ana_1\le a_2\le a_3\le...\le a_n,輸出 YESNO 即可。
  • 多組數據,數據組數不超過 1001001m<n1001\le m<n\le 1001ai1001\le a_i\le 1001pi<n1\le p_i< n
  • translate by @ShineEternal

solution:

其實我們可以把 pip_i 看成一個個傳送帶。

首先如果有 m=n1m=n-1,那麼任何情況都能傳送,也就是說一定有解。

否則的話,我們可以先把傳送帶排序。

然後這時候傳送帶可能會有連成一塊一塊的。(即連續自然數列)

那麼同一塊的我們可以隨便排序,直接 sort\operatorname{sort} 即可。

每一塊傳送帶都這麼操作,最後對 aa 數組進行單調性判斷。

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;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章