题意:给定一个整数n和一个n的全排列,以及一个01串,01串中的0表示第i位不能与第i+1位交换,1表示可以。问能否通过若干次交换使得序列变为1,2,...,N.
题解:根据快排的思想,我们可以把每一个零看成分界点,那么这个点左边的最大值一定会小于右边的最小值,否者一定不能完成排序,因为零的左右两边是无法交换的。
AC代码:
#include <iostream>
#include <cstring>
#include <string>
#include <map>
#include <cstdio>
#include <algorithm>
#define int long long
using namespace std;
const int maxn=1e6+5;
int a[maxn],maxx[maxn],minn[maxn];
main(){
int n;
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
maxx[1]=a[1];
minn[n+1]=1e10;
for(int i=n;i>=1;i--)minn[i]=min(a[i],minn[i+1]);
for(int i=1;i<=n;i++)maxx[i]=max(a[i],maxx[i-1]);
string s;
cin>>s;
int flag=1;
for(int i=0;i<s.size();i++){
int x=i+1;
if(s[i]=='0'){
if(maxx[x]>minn[x+1])flag=0;
}
}
if(flag)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}