Submission #31226

# Submission time Handle Problem Language Result Execution time Memory
31226 2017-08-14T15:23:04 Z leejseo None (KOI16_dist) C++
2 / 100
46 ms 1764 KB
#include <stdio.h>
#include <algorithm>
#include <stdlib.h>

#include <vector>

using namespace std;

#define square(a) ((a) * (long long)(a))

#define MAX_T 10000000
#define MAX_N 30000

class Star
{
        public:
                inline void read() {
                        scanf("%d%d%d%d", &m_org_x, &m_org_y, &m_dx, &m_dy);
                }

                inline int x() const { return m_x; }
                inline int y() const { return m_y; }

                inline void calc_coord(int t) {
                        m_x = m_org_x + t * m_dx;
                        m_y = m_org_y + t * m_dy;
                }

                inline long long distance(const Star &other) const {
                        return square(m_x - other.m_x) + square(m_y - other.m_y);
                }

        private:
                int m_org_x;
                int m_org_y;
                int m_dx;
                int m_dy;
                int m_x;
                int m_y;
};

class StarStack
{
        public:
                StarStack() {}
                inline void push(const Star *star) { m_stars.push_back(star); }
                inline void pop() { m_stars.pop_back(); }

                inline int size() const { return (int)m_stars.size(); }

                inline const Star& operator[](int n) { return *m_stars[n]; }

                inline long long CCW(const Star &P) {
                        const Star &P2 = *m_stars[m_stars.size() - 2];
                        const Star &P1 = *m_stars[m_stars.size() - 1];
                        return
                                (P1.x() - P2.x()) * (P.y() - P2.y()) -
                                (P1.y() - P2.y()) * (P.x() - P2.x());
                }

        private:
                vector<const Star *> m_stars;
};

inline bool operator<(const Star &a, const Star &b) {
        if (a.x() < b.x()) return true;
        if (a.x() > b.x()) return false;
        return a.y() < b.y();
}

bool check_inc_upper(StarStack &UP, StarStack &LO, int i, int j){
        return
                (UP[i + 1].y() - UP[i].y()) * (LO[j].x() - LO[j - 1].x()) >
                (LO[j].y() - LO[j - 1].y()) * (UP[i + 1].x() - UP[i].x());
}

inline long long farthest_distance(Star stars[], int n, int t) {

        for (int i = 0; i < n; i++)
                stars[i].calc_coord(t);

        sort(stars, stars + n);

        StarStack UP, LO;

        for (int i = 0; i < n; i++) {
                while ((UP.size() > 1) && (UP.CCW(stars[i]) >= 0))
                        UP.pop();

                while ((LO.size() > 1) && (LO.CCW(stars[i]) <= 0))
                        LO.pop();

                UP.push(stars + i);
                LO.push(stars + i);
        }

        int i = 0;
        int j = LO.size() - 1;
        long long farthest = 0;
        long long dist;

        while ((i < UP.size() - 1) || (j > 0)) {
                dist = UP[i].distance(LO[j]);
                if (dist > farthest) farthest = dist;

                if (i == UP.size() - 1) j--;
                else if (j == 0) i++;
                else if (check_inc_upper(UP, LO, i, j)) i++;
                else j--;
        }
        dist = UP[i].distance(LO[j]);
        if (dist > farthest) farthest = dist;
        return farthest;
}

int seek_day(Star stars[], int n, int T) {
        int left = 0;
        int right = T;
        while (left <= right) {
                int L = (2 * left + right)/3;
                int R = (left + 2 * right + 1)/3;
                if (farthest_distance(stars, n, L) <= farthest_distance(stars, n, R))
                        right = R - 1;
                else left = L + 1;
        }
        return left;
}

int main() {
        int n, T;
        Star stars[MAX_N];

        scanf("%d%d", &n, &T);
        for (int i=0; i<n; i++)
                stars[i].read();

        int day = seek_day(stars, n, T);
        long long d = farthest_distance(stars, n, day);

        printf("%d\n", day);
        printf("%lld\n", d);
        return 0;
}

Compilation message

dist.cpp: In function 'int main()':
dist.cpp:133:30: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d%d", &n, &T);
                              ^
dist.cpp: In member function 'void Star::read()':
dist.cpp:18:76: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
                         scanf("%d%d%d%d", &m_org_x, &m_org_y, &m_dx, &m_dy);
                                                                            ^
# Verdict Execution time Memory Grader output
1 Correct 0 ms 1756 KB Output is correct
2 Correct 0 ms 1760 KB Output is correct
3 Correct 0 ms 1756 KB Output is correct
4 Correct 0 ms 1764 KB Output is correct
5 Correct 0 ms 1760 KB Output is correct
6 Correct 0 ms 1764 KB Output is correct
7 Correct 0 ms 1756 KB Output is correct
8 Correct 0 ms 1760 KB Output is correct
9 Correct 0 ms 1760 KB Output is correct
10 Correct 0 ms 1756 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 1756 KB Output is correct
2 Correct 0 ms 1760 KB Output is correct
3 Correct 0 ms 1756 KB Output is correct
4 Correct 0 ms 1764 KB Output is correct
5 Correct 0 ms 1760 KB Output is correct
6 Correct 0 ms 1764 KB Output is correct
7 Correct 0 ms 1756 KB Output is correct
8 Correct 0 ms 1760 KB Output is correct
9 Correct 0 ms 1760 KB Output is correct
10 Correct 0 ms 1756 KB Output is correct
11 Incorrect 6 ms 1760 KB Output isn't correct
12 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 46 ms 1760 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 0 ms 1756 KB Output is correct
2 Correct 0 ms 1760 KB Output is correct
3 Correct 0 ms 1756 KB Output is correct
4 Correct 0 ms 1764 KB Output is correct
5 Correct 0 ms 1760 KB Output is correct
6 Correct 0 ms 1764 KB Output is correct
7 Correct 0 ms 1756 KB Output is correct
8 Correct 0 ms 1760 KB Output is correct
9 Correct 0 ms 1760 KB Output is correct
10 Correct 0 ms 1756 KB Output is correct
11 Incorrect 6 ms 1760 KB Output isn't correct
12 Halted 0 ms 0 KB -