Swap Adjacent Elements CodeForces - 920C(思维,快速排序思想)

题意:给定一个整数n和一个n的全排列,以及一个01串,01串中的0表示第i位不能与第i+1位交换,1表示可以。问能否通过若干次交换使得序列变为1,2,...,N.

题解:根据快排的思想,我们可以把每一个零看成分界点,那么这个点左边的最大值一定会小于右边的最小值,否者一定不能完成排序,因为零的左右两边是无法交换的。

AC代码:

#include 
#include 
#include 
#include 
#include 
#include 
#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;iminn[x+1])flag=0;
		}
	}
	if(flag)cout<<"YES"<

 

你可能感兴趣的:(ACM_技巧,ACM_思维)