#include<bits/stdc++.h>
using namespace std;
const int INF = 1e9;
int n;
int x[200005],y[200005];
char tip[200005];
bool scos[200005];
priority_queue<pair<int,pair<int,int>>> pq;///{timp,{id1,id2}}
map<int,set<pair<int,int>>> dE[3],dW[3],dN[3],dS[3];
void calc_vecini(int i)///calculeaza si restu lovirilor
{
if(tip[i]=='E')
{
auto it = dS[2][x[i]+y[i]].lower_bound({x[i],0});
if(it != dS[2][x[i]+y[i]].end())
{
pq.push({-((*it).first - x[i]), {i, (*it).second}});
}
}
else if(tip[i]=='W')
{
}
else if(tip[i]=='N')
{
}
else
{
assert(tip[i]=='S');
auto it = dE[2][x[i]+y[i]].upper_bound({x[i],INF});
if(it != dE[2][x[i]+y[i]].begin())
{
it--;
pq.push({-(x[i] - (*it).first), {i, (*it).second}});
}
}
}
void baga(int i)
{
if(tip[i]=='E')
{
dE[0][y[i]].insert({x[i],i});
dE[1][x[i] - y[i]].insert({x[i],i});
dE[2][x[i] + y[i]].insert({x[i],i});
}
else if(tip[i]=='W')
{
dW[0][y[i]].insert({x[i],i});
dW[1][x[i] - y[i]].insert({x[i],i});
dW[2][x[i] + y[i]].insert({x[i],i});
}
else if(tip[i]=='N')
{
dN[0][x[i]].insert({y[i],i});
dN[1][x[i] - y[i]].insert({x[i],i});
dN[2][x[i] + y[i]].insert({x[i],i});
}
else
{
assert(tip[i]=='S');
dS[0][x[i]].insert({y[i],i});
dS[1][x[i] - y[i]].insert({x[i],i});
dS[2][x[i] + y[i]].insert({x[i],i});
}
}
void scoate(int i)
{
scos[i]=1;
if(tip[i]=='E')
{
dE[0][y[i]].erase({x[i],i});
dE[1][x[i] - y[i]].erase({x[i],i});
dE[2][x[i] + y[i]].erase({x[i],i});
}
else if(tip[i]=='W')
{
dW[0][y[i]].erase({x[i],i});
dW[1][x[i] - y[i]].erase({x[i],i});
dW[2][x[i] + y[i]].erase({x[i],i});
}
else if(tip[i]=='N')
{
dN[0][x[i]].erase({y[i],i});
dN[1][x[i] - y[i]].erase({x[i],i});
dN[2][x[i] + y[i]].erase({x[i],i});
}
else
{
assert(tip[i]=='S');
dS[0][x[i]].erase({y[i],i});
dS[1][x[i] - y[i]].erase({x[i],i});
dS[2][x[i] + y[i]].erase({x[i],i});
}
}
signed main()
{
ios_base::sync_with_stdio(0);cin.tie(0);
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>x[i]>>y[i]>>tip[i];
baga(i);
}
for(int i=1;i<=n;i++)
{
calc_vecini(i);
}
while(!pq.empty())
{
int id1 = pq.top().second.first, id2 = pq.top().second.second;
pq.pop();
if(scos[id1] || scos[id2])
{
if(!scos[id1])
calc_vecini(id1);
if(!scos[id2])
calc_vecini(id2);
continue;
}
scoate(id1);
scoate(id2);
}
for(int i=1;i<=n;i++)
if(!scos[i])
cout<<i<<"\n";
return 0;
}
# | 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... |