Swap Adjacent Elements
CodeForces - 920CYou have an array a consisting of n integers. Each integer from 1 to n appears exactly once in this array.
For some indices i (1 ≤ i ≤ n - 1) it is possible to swap i-th element with (i + 1)-th, for other indices it is not possible. You may perform any number of swapping operations any order. There is no limit on the number of times you swap i-th element with (i + 1)-th (if the position is not forbidden).
Can you make this array sorted in ascending order performing some sequence of swapping operations?
The first line contains one integer n (2 ≤ n ≤ 200000) — the number of elements in the array.
The second line contains n integers a1, a2, ..., an (1 ≤ ai ≤ 200000) — the elements of the array. Each integer from 1 to n appears exactly once.
The third line contains a string of n - 1 characters, each character is either 0 or 1. If i-th character is 1, then you can swap i-th element with (i + 1)-th any number of times, otherwise it is forbidden to swap i-th element with (i + 1)-th.
If it is possible to sort the array in ascending order using any sequence of swaps you are allowed to make, print YES. Otherwise, print NO.
6 1 2 5 3 4 6 01110
YES
6 1 2 5 3 4 6 01010
NO
In the first example you may swap a3 and a4, and then swap a4 and a5.
题意:
思路:
code:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int n,a[200005];
char str[200005];
int main(){
scanf("%d",&n);
memset(str,0,sizeof(str));
for(int i = 0; i < n; i++)
scanf("%d",&a[i]);
scanf("%s",str);
int i,j;
for(i = 0; i < n; i++){
if(str[i] == '1'){//如果是1可交换,一直往后到0第一个不可交换的数或字符串结束为止
int maxx = 0;//记录可交换区间内最大数
for(j = i; ; j++){
if(a[j] < i+1){//小于左边界说明不在区间内不符合
printf("NO\n");
return 0;
}
maxx = max(maxx,a[j]);
if(str[j] == '0' || str[j] == 0){
if(maxx > j+1){//如果到了右边界,且区间内的最大值超出右边界不符合
printf("NO\n");
return 0;
}
i = j;
break;
}
}
}
else if(a[i] != i+1){//如果是0不可交换,那么这个数必须等于下标+1,否则不对
printf("NO\n");
return 0;
}
}
printf("YES\n");
return 0;
}