题目链接:http://codeforces.com/contest/803/problem/B
题意:给你一个序列A,让你输出一个序列d,d[i]表示离a[i]最近的0的距离
解析:我的做法是,先把所有的0的位置存到一个数组b里,然后枚举每一个a[i]的位置,去二分b这个数组,找到一个刚好大于等于i的值
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5+100;
int a[maxn];
int ans[maxn];
int main(void)
{
int n;
scanf("%d",&n);
int tmp = 0,tt;
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
if(a[i]==0)
ans[tmp++] = i;
}
for(int i=0;i<n;i++)
{
if(i)printf(" ");
int pos1 = lower_bound(ans,ans+tmp,i)-ans;
if(pos1==tmp)
pos1--;
if(pos1>=1)
tt = min(abs(ans[pos1-1]-i),abs(ans[pos1]-i));
else
tt = abs(ans[pos1]-i);
if(pos1+1<tmp)
tt = min(tt,abs(ans[pos1+1]-i));
printf("%d",tt);
}
return 0;
}