题意:给定一个整数n和一个n的全排列,以及一个01串,01串中的0表示第i位不能与第i+1位交换,1表示可以。
问能否通过若干次交换使得序列变为1,2,...,N.
这题其实挺简单的ww。
对于01串中0的位置,如果它之前的最大值比它之后的最小值要大就一定不可行,因为前面的换不到后面去,后面的也换不上来。
然后好像就解决了?!
//Suplex
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#define N 200000+2000
using namespace std;
const int inf=1e9;
int n,a[N],maxx[N],mini[N];
char st[N];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++) maxx[i]=max(maxx[i-1],a[i]);
mini[n+1]=inf;
for(int i=n;i;i--) mini[i]=min(mini[i+1],a[i]);
scanf("%s",st+1);
int len=strlen(st+1);
for(int i=1;i<=len;i++){
if(st[i]=='1') continue;
if(maxx[i]>mini[i+1]){puts("NO");return 0;}
}
puts("YES");
return 0;
}