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