Решение для Google Code Jam Round 1B 2019 "Манхэттен Креп" - PullRequest
0 голосов
/ 17 апреля 2020
#include <iostream>
#include <limits>
#include <vector>
#include <map>
#include <utility>
#include <algorithm>
using namespace std;
struct E {
    long x, y;
    char d;
};

long getMax(map<long, long>& l, map<long, long>& u) {

    if (l.size() == 0) {
        return 0;
    }
    if (u.size() == 0) {
        return l.rbegin()->first;
    }
    long sum = 0;
    sum += (l.begin())->second;
    for (auto it = next(l.begin()); it != l.end(); ++it) {
        sum += it->second;
        it->second = sum;
    }

    sum = u.rbegin()->second;
    for (auto it = next(u.rbegin()); it != u.rend(); ++it) {
        sum += it->second;
        it->second = sum;
    }
    auto lit = l.begin();
    auto uit = u.begin();

    while((lit != l.end()) && (uit != u.end())) {
        if (uit->first < lit->first) {
            uit->second -= lit->second;
            ++uit;
        } else {
            if (uit->first == lit->first) {
                uit->second += lit->second;
                ++uit;

            } else {
                while((lit != l.end()) && (uit != u.end())) {
                    auto nlit = next(lit);
                    if ((nlit != l.end()) && (nlit->first < uit->first)) {
                        ++lit;

                        nlit = lit;
                    } else {
                        uit->second += lit->second;
                        ++uit;
                        break;
                    }
                }
            }
        }
    }
    for(auto it = l.begin(); it != l.end(); ++it) {
        if (u.find(it->first) != u.end()) {

        } else {
            auto up = u.upper_bound(it->first);
            if (up != u.end()) {
                u.insert(make_pair(it->first, up->second));
            } else {
                u.insert(make_pair(it->first, it->second));

            }
        }
    }
    long max = numeric_limits<long>::min(), maxIdx = -1;
    if (u.size() != 0) {
        for (auto it = u.begin(); it != u.end(); ++it) {
            if (it->second > max) {
                max = it->second;
                maxIdx = it->first;
            }
        }
    } else {

    }

    return maxIdx;
}

void insert(map<long, long>& m, int val) {
    if (m.find(val) != m.end()) {
        m.insert(make_pair(val, 1));
    } else {
        ++m[val];
    }
}

pair<long, long> getPos(vector<E>& v, long Q) {
    pair<long, long> pos;
    map<long, long> lx, ly, ux, uy;

    for (auto &e: v) {
        int val;
        switch(e.d) {
            case 'N':
                val = e.y + 1;
                if (val > Q) {
                    break;
                }
                if (ly.find(val) != ly.end()) {
                    ly.insert(make_pair(val, 1));
                } else {
                    ++ly[val];
                }
          //      insert(ly, e.y + 1);
        //        insert(ly, e.x);

                break;
            case 'E':
                val = e.x + 1;
                if (val > Q) {
                    break;
                }
                if (lx.find(val) != lx.end()) {
                    lx.insert(make_pair(val, 1));
                } else {
                    ++lx[val];
                }
                break;
            case 'W':
                val = e.x - 1;
                if (val < 0) {
                    break;
                }
                if (ux.find(val) != ux.end()) {
                    ux.insert(make_pair(val, 1));
                } else {
                    ++ux[val];
                }

                break;
            case 'S':
                val = e.y - 1;
                if (val < 0) {
                    break;
                }
                if (uy.find(val) != uy.end()) {
                    uy.insert(make_pair(val, 1));
                } else {
                    ++uy[val];
                }
                break;
        }
    }
    //x


    pos.first  = getMax(lx, ux);
    pos.second = getMax(ly, uy);


    //y



    return pos;
}


int main() {
    int t;
    cin >> t;
    int cnt = 1;
    while(t--) {
        long long P, Q;
        cin >> P;
        cin >> Q;
        vector<E> v;
        while(P--) {
            E e;
          //  e.x = P % (Q - 1);
        //    e.y = P % (Q - 1);
          //  e.d = 'E';
            cin >> e.x;
            cin >> e.y;
            cin >> e.d;
            v.push_back(e);
        }
        auto res = getPos(v, Q);
        cout << "Case #"<<cnt<<": "<<res.first<<" "<<res.second<<endl;
        ++cnt;
    }   
    return 0;
}

Я пытался решить эту проблему https://codingcompetitions.withgoogle.com/codejam/round/0000000000051706/000000000012295c

, мне удалось найти это решение, которое проходит через примеры тестовых случаев, но не проходит даже первый настоящий контрольный пример. Я потерял терпение и посмотрел на анализ. Похоже, я нашел наиболее оптимальное из возможных решений, но не могу понять, в чем заключается ошибка. Может кто-нибудь помочь, что не так с моим кодом? Очень ценю это!

...