抱歉,由于眼瞎,之前的代码被hack了,已更正。
题意:
给你一串数字序列和一串0,1组成的字符串。如果数字序列中的元素所在下标在字符串中为‘1’,则可以和i+1交换。求是否可以得到递增的数字序列。
思路:
根据冒泡排序可知,任何一个无序序列都可以通过相邻元素交换变成有序的。那么问题就简单了。
如果当前数字不能交换,则判断它是否等于其下标+1,;
否则判断找出这一段‘1’的右边界(‘0’或 '\0'),判断这一段区间内存储的数字是否在下标区间内。如果在区间外则输出no。将j的值赋给i。
可以定义一个minn,maxx记录区间内的最大值和最小值。事实上,为了节省时间,可以省略minn,因为已知左边界,所以在遍历数组时判断当前下标的数字是否小于左边界就可以了。
代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<set>
#include<iostream>
#include<queue>
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')
{
int maxx=0;
for(j=i; ; j++)
{
if(a[j]<i+1)
{
printf("NO\n");
exit(0);
}
maxx=max(maxx,a[j]);
if(str[j]=='0' || str[j]==0)
{
if(maxx>j+1)
{
printf("NO\n");
exit(0);
}
i=j;
break;
}
}
}
else if(a[i]!=i+1)
{
printf("NO\n");
exit(0);
}
}
printf("YES\n");
return 0;
}