题意
输入n
再输入n个数为1~n的一种排列
再输入n-1个1或0,1表示该元素可以和后面的元素进行交换,0表示不能和后面的元素进行交换
让我们判断这个数组能否经过交换得到一个递增序列
分析
我们发现连续的1的范围内再加上后面一个0 此区间内任意一个元素是可以通过向后交换去到任意位置的
因为连续的1表示区间内所有元素不仅可以向后交换,也可以说是后一个元素可以向前交换。然而0前面的元素却不能交换到0后面 所以每个小范围独立 只要把所有那些连续的1+后一个0 符合条件的范围内全部排序 之后的序列是个递增序列 即满足
否 则不满足
code
package main;
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Main{
public static void main(String [] args){
int n;
Scanner sc = new Scanner(System.in);
int[] a = new int[200010];
int[] bok = new int[200010];
int[] pos = new int[200010];
n = sc.nextInt();
for(int i=1;i<=n;i++)
{
a[i] = sc.nextInt();
}
int tmp = 0,s=-1,e=-1;
String line = sc.next();
for(int i=0;i<line.length();i++){
tmp = line.charAt(i)-'0';
if(s==-1&&tmp==1)s=i;
else if(tmp==0&&s!=-1){
e=i+1;
Arrays.sort(a,s+1,e+1);
s=-1;
e=-1;
}
}
if(tmp==1&&s!=-1)
Arrays.sort(a,s+1,n+1);
int i;
for(i=1;i<=n;i++)
if(a[i]!=i){
System.out.println("NO");
break;
}
if(i==n+1)
System.out.println("YES");
}
}