#include<bits/stdc++.h>
#define int long long
using namespace std;
vector<int> nw[200005], ne[200005], sw[200005], se[200005], north[200005], west[200005], south[200005], east[200005];
vector<int> vec1, vec2, vec3, vec4;
pair<int, int> p[200005];
int dir[200005];
bool visited[200005];
inline bool cmp(const int x, const int y)
{
return p[x] < p[y];
}
inline bool cmp2(const int x, const int y)
{
return p[x] > p[y];
}
inline int dis(int x, int y)
{
return (abs(p[x].first - p[y].first)+abs(p[x].second - p[y].second))/2;
}
bool dfs(int u, int pardis)
{
if(visited[u] == 1) return 0;
visited[u] = 1;
int diag1 = upper_bound(vec1.begin(), vec1.end(), p[u].first - p[u].second) - vec1.begin();
int diag2 = upper_bound(vec2.begin(), vec2.end(), p[u].first + p[u].second) - vec2.begin();
int diag3;
if(dir[u]%2 == 1) diag3 = upper_bound(vec4.begin(), vec4.end(), p[u].second) - vec4.begin();
else diag3 = upper_bound(vec3.begin(), vec3.end(), p[u].first) - vec3.begin();
vector<int>::iterator le, ri, mid;
if(dir[u] == 0){
le = upper_bound(ne[diag2].begin(), ne[diag2].end(), u, cmp2);
ri = upper_bound(se[diag1].begin(), se[diag1].end(), u, cmp);
mid = upper_bound(east[diag3].begin(), east[diag3].end(), u, cmp);
}
else if(dir[u] == 1){
le = upper_bound(se[diag1].begin(), se[diag1].end(), u, cmp);
ri = upper_bound(sw[diag2].begin(), sw[diag2].end(), u, cmp);
mid = upper_bound(south[diag3].begin(), south[diag3].end(), u, cmp);
}
else if(dir[u] == 2){
le = upper_bound(sw[diag2].begin(), sw[diag2].end(), u, cmp);
ri = upper_bound(nw[diag1].begin(), nw[diag1].end(), u, cmp2);
mid = upper_bound(west[diag3].begin(), west[diag3].end(), u, cmp2);
}
else{
le = upper_bound(nw[diag1].begin(), nw[diag1].end(), u, cmp2);
ri = upper_bound(ne[diag2].begin(), ne[diag2].end(), u, cmp2);
mid = upper_bound(north[diag3].begin(), north[diag3].end(), u, cmp2);
}
//Now we do some iterations
while(*le != 0 || *ri != 0 || *mid != 0){
bool ok = 0, good1 = 0, good2 = 0, good3 = 0;
int redis;
if((*ri == 0 || dis(*le, u) <= dis(*ri, u)) && (*mid == 0 || dis(*le, u) <= dis(*mid, u))){
if(dis(*le, u) > pardis) break;
good1 = 1;
if(*le != 0 && dir[*le] == (dir[u]+1)%4){
redis = dis(*le, u);
ok |= dfs(*le, dis(*le, u));
}
}
if((*le == 0 || dis(*le, u) >= dis(*ri, u)) && (*mid == 0 || dis(*mid, u) >= dis(*ri, u))){
if(dis(*ri, u) > pardis) break;
good2 = 1;
if(*ri != 0 && dir[*ri] == (dir[u]+3)%4){
redis = dis(*ri, u);
ok |= dfs(*ri, dis(*ri, u));
}
}
if((*le == 0 || dis(*le, u) >= dis(*mid, u)) && (*ri == 0 || dis(*mid, u) <= dis(*ri, u))){
if(dis(*mid, u) > pardis) break;
good3 = 1;
if(*mid != 0 && dir[*mid] == (dir[u]+2)%4){
redis = dis(*mid, u);
ok |= dfs(*mid, dis(*mid, u));
}
}
if(good1 == 1) le++;
if(good2 == 1) ri++;
if(good3 == 1) mid++;
if(ok == 1){
if(redis == pardis) return 1;
else return 0;
}
}
return 1;
}
signed main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
int n; cin>>n;
for(int i = 1; i <= n; i++){
char x;
cin>>p[i].first>>p[i].second>>x;
swap(p[i].first, p[i].second);
if(x == 'E') dir[i] = 0;
if(x == 'S') dir[i] = 1;
if(x == 'W') dir[i] = 2;
if(x == 'N') dir[i] = 3;
}
for(int i = 1; i <= n; i++){
vec1.push_back(p[i].first-p[i].second);
}
p[0] = make_pair(3e9, 3e9);
sort(vec1.begin(), vec1.end());
vec1.erase(unique(vec1.begin(), vec1.end()), vec1.end());
for(int i = 1; i <= n; i++){
int pl = upper_bound(vec1.begin(), vec1.end(), p[i].first-p[i].second)-vec1.begin();
se[pl].push_back(i);
}
for(int i = 1; i <= n; i++){
sort(se[i].begin(), se[i].end(), cmp);
nw[i] = se[i];
reverse(nw[i].begin(), nw[i].end());
se[i].push_back(0); nw[i].push_back(0);
}
/**/
for(int i = 1; i <= n; i++){
vec2.push_back(p[i].first+p[i].second);
}
sort(vec2.begin(), vec2.end());
vec2.erase(unique(vec2.begin(), vec2.end()), vec2.end());
for(int i = 1; i <= n; i++){
int pl = upper_bound(vec2.begin(), vec2.end(), p[i].first+p[i].second)-vec2.begin();
sw[pl].push_back(i);
}
for(int i = 1; i <= n; i++){
sort(sw[i].begin(), sw[i].end(), cmp);
ne[i] = sw[i];
reverse(ne[i].begin(), ne[i].end());
sw[i].push_back(0); ne[i].push_back(0);
}
/**/
for(int i = 1; i <= n; i++){
vec3.push_back(p[i].first);
}
sort(vec3.begin(), vec3.end());
vec3.erase(unique(vec3.begin(), vec3.end()), vec3.end());
for(int i = 1; i <= n; i++){
int pl = upper_bound(vec3.begin(), vec3.end(), p[i].first)-vec3.begin();
east[pl].push_back(i);
}
for(int i = 1; i <= n; i++){
sort(east[i].begin(), east[i].end(), cmp);
west[i] = east[i];
reverse(west[i].begin(), west[i].end());
west[i].push_back(0); east[i].push_back(0);
}
/**/
for(int i = 1; i <= n; i++){
vec4.push_back(p[i].second);
}
sort(vec4.begin(), vec4.end());
vec4.erase(unique(vec4.begin(), vec4.end()), vec4.end());
for(int i = 1; i <= n; i++){
int pl = upper_bound(vec4.begin(), vec4.end(), p[i].first)-vec4.begin();
south[pl].push_back(i);
}
for(int i = 1; i <= n; i++){
sort(south[i].begin(), south[i].end(), cmp);
north[i] = south[i];
reverse(north[i].begin(), north[i].end());
south[i].push_back(0); north[i].push_back(0);
}
for(int i = 1; i <= n; i++) if(dfs(i, 1e18) == 1) cout<<i<<'\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... |