题意
输入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");}
}