问题
https://vjudge.net/problem/UVA-1554
按照上面的二分查找程序,会输出, “Found item i = XXX in L =
Y Y Y comparisons”,现在给一组i和L,经过了L次查找在a[i]发现,问所有可能生成该信息的N?因为N的数量很多,所以按照区间输出
分析
从i+1到maxn,遍历所有可能的N,然后对于每一个N,使用二分法查找i,看能否在L步到达i。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <map>
#include <string>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
typedef long long LL;
const int N=10000+1;
int i,L,s,kase=0,vis[N+10];
vector<pair<int,int>> vi;
inline bool binary(int x){
int p=0,q=x-1,mid,d=0;
while(d<L){
if(p>q) break;
mid=(p+q)/2;
++d;
if(d==L) return mid==i;
if(mid==i) return false;
else if(i<mid) q=mid-1;
else p=mid+1;
}
return d==L;
}
int main(void){
while(scanf("%d%d",&i,&L)==2){
vi.clear();
memset(vis,0,sizeof(vis));
for(int j=i+1;j<N;++j){
if(binary(j)) vis[j]=1;
}
int t1=0;
for(int k=i+1;k<N+1;++k){
if(vis[k]==1 && vis[k-1]==0) t1=k;
if(vis[k]==0 && vis[k-1]==1) vi.push_back(make_pair(t1,k));
}
printf("%d\n",vi.size());
for(int i=0;i<vi.size();++i) {
printf("%d %d\n", vi[i].first, vi[i].second-1);
}
}
return 0;
}