제출 #1026366

#제출 시각아이디문제언어결과실행 시간메모리
102636612345678Naval battle (CEOI24_battle)C++17
37 / 100
3085 ms542772 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...