Educational Codeforces Round 20 B. Distances to Zero

原创 2018年04月17日 18:10:15

1.题目链接

http://codeforces.com/contest/803/problem/B

2.题面

B. Distances to Zero
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

You are given the array of integer numbers a0, a1, ..., an - 1. For each element find the distance to the nearest zero (to the element which equals to zero). There is at least one zero element in the given array.

Input

The first line contains integer n (1 ≤ n ≤ 2·105) — length of the array a. The second line contains integer elements of the array separated by single spaces ( - 109 ≤ ai ≤ 109).

Output

Print the sequence d0, d1, ..., dn - 1, where di is the difference of indices between i and nearest j such that aj = 0. It is possible that i = j.

Examples
input
Copy
9
2 1 0 3 0 0 3 2 4
output
Copy
2 1 0 1 0 0 1 2 3 
input
Copy
5
0 1 2 3 4
output
Copy
0 1 2 3 4 
input
Copy
7
5 6 0 1 -2 3 4
output
Copy
2 1 0 1 2 3 4 

3.题意

给以一个数组,要你求每个数到最近的0的距离。

4.思路

我的思路是nlogn的,将所有0的地址存进另一个数组,然后对于每个位置二分查找离他最近的下一个0的位置,然后对于当前位置的0和上一个位置的0进行取min。

还有一个o(n)的思路,就是直接从前往后遍历数组,用pre数组来保存每个元素上一个0的位置。然后从后往前遍历数组,用next数组保存下一个0的位置,最后遍历一遍,两者取min。

5.代码实现

本代码为nlogn实现

#include<iostream>
#include<math.h>
#include<stdio.h>
#include<algorithm>
#include<queue>
#include<map>
#include<stack>
#include<set>
#include<vector>
#include <time.h>
#include<string.h>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef double db;
typedef pair <int, int> pii;
typedef pair <ll, ll> pll;
typedef pair <ll, int> pli;
typedef pair <db, db> pdd;

const int maxn = 2e5+5;
const int Mod=1000000007;
const int INF = 0x3f3f3f3f;
const ll LL_INF = 0x3f3f3f3f3f3f3f3f;
const double e=2.718281828459045235360287471352662;
const db PI = acos(-1);
const db ERR = 1e-10;

#define Se second
#define Fi first
#define pb push_back
int a[maxn];
int b[maxn];
int n;
int main()
{
    ios::sync_with_stdio(false);
    //freopen("a.txt","r",stdin);
    //freopen("b.txt","w",stdout);
    cin>>n;
    int cnt=0;
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
        if(a[i]==0)
            b[cnt++]=i;
    }
    for(int i=0;i<n;i++)
    {
        int pos=lower_bound(b,b+cnt,i)-b;
        if(pos==0)
            cout<<b[0]-i<<" ";
        else if(pos==cnt)
            cout<<i-b[pos-1]<<" ";
        else
            cout<<min(b[pos]-i,i-b[pos-1])<<" ";
    }
    //cout << "time: " << (long long)clock() * 1000 / CLOCKS_PER_SEC << " ms" << endl;
    return 0;
}

6.反思

水题,注意细节和手速就好

Codeforces Educational Codeforces Round 41 (Rated for Div. 2) B. Lecture Sleep

点击打开链接#include &amp;lt;iostream&amp;gt; #include&amp;lt;cstdio&amp;gt; #include&amp;lt;algorithm&amp...
  • m0_37428263
  • m0_37428263
  • 2018-04-05 10:35:27
  • 97

Educational Codeforces Round 38 (Rated for Div. 2) B. Run For Your Prize

B. Run For Your PrizeYou and your friend are participating in a TV show &quot;Run For Your Prize&quo...
  • s540239976
  • s540239976
  • 2018-02-17 13:35:37
  • 214

Educational Codeforces Round 39 Editorial B(Euclid算法,连续-=与%=的效率)

You have two variables a and b. Consider the following sequence of actions performed with these vari...
  • qq_38586027
  • qq_38586027
  • 2018-03-07 16:20:24
  • 59

Codeforces Educational Codeforces Round 42 (Rated for Div. 2) B. Students in Railway Carriage 填放人数

点击打开链接#include&amp;lt;iostream&amp;gt; #include&amp;lt;cstdio&amp;gt; #include&amp;lt;cstring&amp;gt...
  • m0_37428263
  • m0_37428263
  • 2018-04-11 12:58:13
  • 63

Educational Codeforces Round 38 (Rated for Div. 2) 【B】 【双指针】

B. Run For Your Prize time limit per test 1 second memory limit per test 256 megabytes ...
  • Head_Hard
  • Head_Hard
  • 2018-02-21 16:56:52
  • 59

解题报告:Educational Codeforces Round 24 D,E,F

D、题目链接 题意: 给定一个长度为n的序列,给定一个数a,询问是否存在数b满足从前往后遍历序列,数b出现的次数始终大于等于数a出现的次数。 思路: 把每两个数a之间看做一个筛选阶段,每次筛选掉之...
  • qq_32570675
  • qq_32570675
  • 2017-07-01 14:07:43
  • 287

Educational Codeforces Round 36 (Rated for Div. 2) 题解

先总结一波 第一次打cf,感觉还不错,题目做得挺顺手。虽然开始30min才想起来有这么个比赛来着。。 纪念一下第一次的rank,话说题真是水 这是大概还剩下5min的时候截的,实际可能会...
  • jpwang8
  • jpwang8
  • 2018-01-13 23:16:24
  • 366

Educational Codeforces Round 27

A 题意:把2 * n个人分成两组,使得无论两组的人怎么进行比赛 第一组的人始终都要保持全赢,如果两个人能力值相等两人都可以赢 思路:排序后只要保证n + 1个人的能力值大于第n个人的能力值即可 #i...
  • sasuke__
  • sasuke__
  • 2017-08-23 10:35:32
  • 237

Educational Codeforces Round 34 (Rated for Div. 2)

这是我这个弱渣第一次正儿八经打codeforce的比赛 只水出来A题一道签到题,B题和C题只是有思路 但是并没有写出来 至于D E F就根本没有看 可能没有挑战的欲望吧 以后就算做不出来也会想一想思路...
  • hdsdogge
  • hdsdogge
  • 2017-12-13 16:57:49
  • 92

Educational Codeforces Round 38 题解

总结 A由于阅读水平不够看了好久才看懂。这次的edu比之前我做的一场难了,D其实很简单但我往另一个方向想了,所以没有做出来,倒是E很快就切了。 这是最终成绩: 题解 A. Word...
  • qq_33229466
  • qq_33229466
  • 2018-02-18 12:51:47
  • 172
收藏助手
不良信息举报
您举报文章:Educational Codeforces Round 20 B. Distances to Zero
举报原因:
原因补充:

(最多只允许输入30个字)