给定一个长度为 nn 的数组 a1,a2,…,ana1,a2,…,an。
该数组是一个 1∼n1∼n 的排列。
数组的前 n−1n−1 个位置中,部分位置可以进行交换操作,将该位置的元素与后面相邻位置的元素进行互换。
交换操作的次序和次数均不限。
请你判断给定的数组能否通过交换操作变为一个升序数组。
输入格式
第一行包含整数 nn。
第二行包含 nn 个整数 a1,a2,…,ana1,a2,…,an。
第三行包含一个长度为 n−1n−1 的 0101 字符串,第 ii 个字符为 11 表示第 ii 个位置可以进行交换操作,第 ii 个字符为 00 表示第 ii 个位置无法进行交换操作。
输出格式
给定的数组可以通过交换操作变为一个升序数组则输出 YES
,否则输出 NO
。
数据范围
2≤n≤2×1052≤n≤2×105,
1≤ai≤n1≤ai≤n,aiai 两两不同。
输入样例1:
6
1 2 5 3 4 6
01110
输出样例1:
YES
输入样例2:
6
1 2 5 3 4 6
01010
输出样例2:
NO
AC:难度属于简单级别,当数组中某一个位置的值大于后一位置且字符数组中相应位置的字符为‘1’,即可交换,否则不需要交换 或 不能变为升序数组。
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
int num[n];
for(int i = 0; i < n ;i++)
{
scanf("%d",&num[i]);
}
getchar();
char str[n];
gets(str);
int flag = 1;
for(int i = 0; i < n; i++)
{
if(num[i] > num[i+1] && str[i] == '1')
{
int tmp =num[i];
num[i] = num[i+1];
num[i+1] = tmp;
}
else if (num[i] > num[i+1] && str[i] == '0')
{
flag = 0;
break;
}
}
if(flag)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
return 0;
}