이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
const int nx=5e3+5;
int n, x[nx], y[nx], dn[nx];
char dr[nx];
map<int, map<pair<int, int>, set<int>>> mp;
tuple<int, int, int> crash(int i, int j)
{
if (dr[i]==dr[j]) return {0, 0, 0};
if ((dr[i]=='N'&&dr[j]=='S'))
{
if (x[i]==x[j]&&y[i]>y[j]&&(y[i]-y[j])%2==0) return {(y[i]-y[j])/2, x[i],y[j]+(y[i]-y[j])/2};
else return {0, 0, 0};
}
if ((dr[i]=='S'&&dr[j]=='N'))
{
if (x[i]==x[j]&&y[j]>y[i]&&(y[j]-y[i])%2==0) return {(y[j]-y[i])/2, x[i],y[i]+(y[j]-y[i])/2};
else return {0, 0, 0};
}
if ((dr[i]=='W'&&dr[j]=='E'))
{
if (y[i]==y[j]&&x[i]>x[j]&&(x[i]-x[j])%2==0) return {(x[i]-x[j])/2, min(x[i], x[j])+(x[i]-x[j])/2, y[i]};
else return {0, 0, 0};
}
if ((dr[i]=='E'&&dr[j]=='W'))
{
if (y[i]==y[j]&&x[j]>x[i]&&(x[j]-x[i])%2==0) return {(x[j]-x[i])/2, min(x[i], x[j])+(x[j]-x[i])/2, y[i]};
else return {0, 0, 0};
}
if (dr[i]=='N')
{
if (dr[j]=='W'&&y[i]>y[j]&&y[i]-y[j]==x[j]-x[i]) return {y[i]-y[j], x[i], y[j]};
if (dr[j]=='E'&&y[i]>y[j]&&y[i]-y[j]==x[i]-x[j]) return {y[i]-y[j], x[i], y[j]};
}
if (dr[i]=='S')
{
if (dr[j]=='W'&&y[i]<y[j]&&y[j]-y[i]==x[j]-x[i]) return {y[j]-y[i], x[i], y[j]};
if (dr[j]=='E'&&y[i]<y[j]&&y[j]-y[i]==x[i]-x[j]) return {y[j]-y[i], x[i], y[j]};
}
if (dr[j]=='N')
{
if (dr[i]=='W'&&y[j]>y[i]&&y[j]-y[i]==x[i]-x[j]) return {y[j]-y[i], x[j], y[i]};
if (dr[i]=='E'&&y[j]>y[i]&&y[j]-y[i]==x[j]-x[i]) return {y[j]-y[i], x[j], y[i]};
}
if (dr[j]=='S')
{
if (dr[i]=='W'&&y[j]<y[i]&&y[i]-y[j]==x[i]-x[j]) return {y[i]-y[j], x[j], y[i]};
if (dr[i]=='E'&&y[j]<y[i]&&y[i]-y[j]==x[j]-x[i]) return {y[i]-y[j], x[j], y[i]};
}
return {0, 0, 0};
}
int main()
{
cin.tie(NULL)->sync_with_stdio(false);
cin>>n;
for (int i=1; i<=n; i++) cin>>x[i]>>y[i]>>dr[i];
for (int i=1; i<=n; i++)
{
for (int j=i+1; j<=n; j++)
{
auto [x, y, z]=crash(i, j);
//cout<<"debug "<<i<<' '<<j<<' '<<x<<' '<<y<<' '<<z<<'\n';
if (x==0) continue;
mp[x][{y, z}].insert(i);
mp[x][{y, z}].insert(j);
}
}
for (auto [t, x]:mp)
{
for (auto [c, s]:x)
{
int cnt=0;
for (auto p:s) if (!dn[p]) cnt++;
if (cnt>1) for (auto p:s) dn[p]=1;
}
}
for (int i=1; i<=n; i++) if (!dn[i]) cout<<i<<'\n';
}
/*
4
0 0 E
2 0 E
4 0 W
6 0 W
*/
# | 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... |