提交时间:2022-06-04 13:25:31

运行 ID: 1287

#include<bits/stdc++.h> using namespace std; const int N = 2e5 + 10; int a[N], b[N]; // b[i]储存a中数为零的下标 int f1(int x, int l, int r){ //找第一个>=z的数 while(l < r){ int mid = l + r >> 1; if(b[mid] < x){ l = mid + 1; } else r = mid; } return b[l]; } int f2(int x, int l, int r){ //找第一个 <x 的数 while(l < r){ int mid = l + r + 1 >> 1; if(b[mid] >= x){ r = mid - 1; } else l = mid; } return b[l]; } int main(){ int n, tj = 0; cin >> n; for(int i = 1;i <= n;i ++){ cin >> a[i]; if(!a[i]) b[++ tj] = i; } for(int i = 1;i <= n;i ++){ int t1 = abs(f1(i, 1, tj) - i), t2 = abs(f2(i, 1, tj) - i); if(t1 > t2){ cout << t2 << " "; } else cout << t1 << " "; } }