이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pl = pair<long, long>;
#define all(x) (x).begin(), (x).end()
#define sz(x) (int)size(x)
constexpr ll inf = 1e18;
map<char, pair<int, int>> vecs = {{'N', {0, -1}}, {'E', {1, 0}}, {'S', {0, 1}}, {'W', {-1, 0}}};
int main(){
cin.tie(0)->sync_with_stdio(false);
int n;
cin >> n;
vector<ll> x(n), y(n);
vector<char> dir(n);
map<ll, vector<int>> ES, EW, EN, SN, WS, WN;
for(int i = 0; i < n; i++){
cin >> x[i] >> y[i] >> dir[i];
ll s = x[i], t = y[i];
if(dir[i] == 'E'){
ES[s+t].push_back(i);
EW[t ].push_back(i);
EN[s-t].push_back(i);
}
if(dir[i] == 'S'){
ES[s+t].push_back(i);
SN[s ].push_back(i);
WS[s-t].push_back(i);
}
if(dir[i] == 'W'){
WN[s+t].push_back(i);
EW[t ].push_back(i);
WS[s-t].push_back(i);
}
if(dir[i] == 'N'){
WN[s+t].push_back(i);
SN[s ].push_back(i);
EN[s-t].push_back(i);
}
}
vector<list<int>> lines;
vector<vector<pair<list<int>::iterator, int>>> ptr(n);
priority_queue<tuple<ll, int, int>> pq;
auto calcTime = [&](int i, int j){
if(dir[i] == dir[j]) return inf;
auto [ivx, ivy] = vecs[dir[i]];
auto [jvx, jvy] = vecs[dir[j]];
ll vx = ivx - jvx, vy = ivy - jvy;
ll dx = x[j] - x[i], dy = y[j] - y[i];
ll factor = 0;
if(vx != 0) factor = dx / vx;
else factor = dy / vy;
assert(vx * factor == dx && vy * factor == dy);
if(factor < 0) return inf;
else return factor;
};
auto init = [&](map<ll, vector<int>>& mp, function<ll(int)> f){
for(auto &[_, v] : mp){
sort(all(v), [&](int a, int b){return f(a) < f(b);});
lines.push_back(list<int>(all(v)));
int prv = -1;
for(auto it = lines.back().begin(); it != lines.back().end(); it++){
ptr[*it].emplace_back(it, sz(lines)-1);
if(prv != -1) pq.emplace(-calcTime(prv, *it), prv, *it);
prv = *it;
}
}
};
init(ES, [&](int i){return x[i];});
init(EW, [&](int i){return x[i];});
init(EN, [&](int i){return x[i];});
init(SN, [&](int i){return y[i];});
init(WS, [&](int i){return x[i];});
init(WN, [&](int i){return x[i];});
vector<ll> killed(n, inf);
auto remove = [&](int r){
for(auto [it, ind] : ptr[r]){
int i = -1, j = -1;
if(it != lines[ind].begin())
i = *prev(it);
if(next(it) != lines[ind].end())
j = *next(it);
if(i != -1 && j != -1)
pq.emplace(-calcTime(i, j), i, j);
lines[ind].erase(it);
};
};
while(!pq.empty()){
auto [t, i, j] = pq.top(); pq.pop();
t = -t;
if(t == inf) break;
if(killed[i] < t || killed[j] < t) continue;
if(killed[i] == inf) remove(i);
if(killed[j] == inf) remove(j);
killed[i] = killed[j] = t;
}
for(int i = 0; i < n; i++){
if(killed[i] == inf) cout << (i+1) << "\n";
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |