设 n 个不同的整数排好序后存于 T[0:n-1] 中,若存在若干(>=0)个下标 i,0<= i <=n-1,使得 T[i]=i。设计一个有效算法找到这些下标。
数据输入:第 1 行有一个正整数 n(n<=1000000),表示有n个整数(保证在int内),接下来一行是这 n 个整数。
结果输出:T[i]=i 的下标。若没有则输出 No。注意输出最后有个空格。
样例
输入(1)
2
0 1
输出(1)
0 1
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=1e6+5;
int n,a[N],b[N],s=0,flag=1;
void bs(int l,int r)
{
int mid=(l+r)/2;
if(l<=r)
{
if(a[mid]==mid)
{
b[s]=mid;
s++;
bs(l,mid-1);
bs(mid+1,r);
}
else if(a[mid]<mid)
{
if(flag) bs(mid+1,r);
else bs(l,mid-1);
}
else if(a[mid]>mid)
{
if(flag) bs(l,mid-1);
else bs(mid+1,r);
}
}
}
int main(){
cin>>n;
for(int i=0;i<n;i++) scanf("%d",&a[i]);
if(a[0]>a[n-1]) flag=0;
bs(0,n-1);
if(s>0)
{
sort(b,b+s);
for(int i=0;i<s;i++) printf("%d ",b[i]);
printf("\n");
}
else printf("No \n");
}