Algorithm to calculate number of intersecting discs

前端 未结 30 1567
鱼传尺愫
鱼传尺愫 2020-12-12 10:57

Given an array A of N integers we draw N discs in a 2D plane, such that i-th disc has center in (0,i) and a radius

30条回答
  •  暗喜
    暗喜 (楼主)
    2020-12-12 11:37

    Here's a two-pass C++ solution that doesn't require any libraries, binary searching, sorting, etc.

    int solution(vector &A) {
        #define countmax 10000000
        int count = 0;
        // init lower edge array
        vector E(A.size());
        for (int i = 0; i < (int) E.size(); i++)
            E[i] = 0;
        // first pass
        // count all lower numbered discs inside this one
        // mark lower edge of each disc
        for (int i = 0; i < (int) A.size(); i++)
        {
            // if disc overlaps zero
            if (i - A[i] <= 0)
                count += i;
            // doesn't overlap zero
            else {   
                count += A[i];
                E[i - A[i]]++;
            }
            if (count > countmax)
                return -1;
        }
        // second pass
        // count higher numbered discs with edge inside this one
        for (int i = 0; i < (int) A.size(); i++)
        {
            // loop up inside this disc until top of vector
            int jend = ((int) E.size() < (long long) i + A[i] + 1 ? 
                        (int) E.size() : i + A[i] + 1);
            // count all discs with edge inside this disc
            // note: if higher disc is so big that edge is at or below 
            // this disc center, would count intersection in first pass
            for (int j = i + 1; j < jend; j++)
                count += E[j];
            if (count > countmax)
                return -1;
        }
        return count;
    }
    

提交回复
热议问题