#include <bits/stdc++.h>
using namespace std;
using pii=pair<int, int>;
using pipii=pair<int, pii>;
pipii makePipii(int v1, int v2, int v3){
pipii ret;
ret.first=v1;
ret.second.first=v2;
ret.second.second=v3;
return ret;
}
pair<bool, int> trovaScontro(char dir1, pii pos1, char dir2, pii pos2){
const pair<bool, int> noScontro={false, -1};
if(dir1==dir2) return noScontro;
if(dir1=='E'){
if(dir2=='W'){
if(pos1.second==pos2.second && pos1.first<pos2.first) return {true, (pos2.first-pos1.first)/2};
else return noScontro;
}else if(dir2=='N'){
pii intersez={pos2.first, pos1.second};
int time1=intersez.first-pos1.first;
int time2=pos2.second-intersez.second;
if(time1==time2 && time1>0) return {true, time1};
else return noScontro;
}else if(dir2=='S'){
pii intersez={pos2.first, pos1.second};
int time1=intersez.first-pos1.first;
int time2=intersez.second-pos2.second;
if(time1==time2 && time1>0) return {true, time1};
else return noScontro;
}
}else if(dir1=='W'){
if(dir2=='E'){
if(pos1.second==pos2.second && pos2.first<pos1.first) return {true, (pos1.first-pos2.first)/2};
else return noScontro;
}else if(dir2=='N'){
pii intersez={pos2.first, pos1.second};
int time1=pos1.first-intersez.first;
int time2=pos2.second-intersez.second;
if(time1==time2 && time1>0) return {true, time1};
else return noScontro;
}else if(dir2=='S'){
pii intersez={pos2.first, pos1.second};
int time1=pos1.first-intersez.first;
int time2=intersez.second-pos2.second;
if(time1==time2 && time1>0) return {true, time1};
else return noScontro;
}
}else if(dir1=='N'){
if(dir2=='S'){
if(pos1.first==pos2.first && pos2.second<pos1.second) return {true, (pos1.second-pos2.second)/2};
else return noScontro;
}else if(dir2=='E'){
pii intersez={pos1.first, pos2.second};
int time1=pos1.second-intersez.second;
int time2=intersez.first-pos2.first;
if(time1==time2 && time1>0) return {true, time1};
else return noScontro;
}else if(dir2=='W'){
pii intersez={pos1.first, pos2.second};
int time1=pos1.second-intersez.second;
int time2=pos2.first-intersez.first;
if(time1==time2 && time1>0) return {true, time1};
else return noScontro;
}
}else if(dir1=='S'){
if(dir2=='N'){
if(pos1.first==pos2.first && pos1.second<pos2.second) return {true, (pos2.second-pos1.second)/2};
else return noScontro;
}else if(dir2=='E'){
pii intersez={pos1.first, pos2.second};
int time1=intersez.second-pos1.second;
int time2=intersez.first-pos2.first;
if(time1==time2 && time1>0) return {true, time1};
else return noScontro;
}else if(dir2=='W'){
pii intersez={pos1.first, pos2.second};
int time1=intersez.second-pos1.second;
int time2=pos2.first-intersez.first;
if(time1==time2 && time1>0) return {true, time1};
else return noScontro;
}
}
}
vector<int> affonda(int N, vector<int> X, vector<int> Y, vector<char> D){
vector<pipii> scontri;
for(int i=0; i<N; i++){
char direzioneAtt=D[i];
pii posAtt={X[i], Y[i]};
for(int j=i+1; j<N; j++){
char direzione2=D[j];
pii pos2={X[j], Y[j]};
pair<bool, int> result=trovaScontro(direzioneAtt, posAtt, direzione2, pos2);
if(result.first){
scontri.push_back(makePipii(result.second, i, j));
}
}
}
sort(scontri.begin(), scontri.end());
vector<bool> isAlive(N, true);
int currTime=0;
set<int> toKill;
for(int i=0; i<scontri.size(); i++){
int n1=scontri[i].second.first, n2=scontri[i].second.second;
if(scontri[i].first!=currTime){
currTime=scontri[i].first;
for(int nave : toKill) isAlive[nave]=false;
toKill.erase(toKill.begin(), toKill.end());
}
if(isAlive[n1] && isAlive[n2]){
toKill.insert(n1);
toKill.insert(n2);
}
}
for(int nave : toKill) isAlive[nave]=false;
vector<int> ans;
for(int i=0; i<N; i++){
if(isAlive[i]) ans.push_back(i+1);
}
return ans;
}
int main() {
ifstream cin("input.txt");
ios_base::sync_with_stdio(false); cin.tie(nullptr);
int N; cin >> N;
vector<int> X(N), Y(N);
vector<char> D(N);
for (int i = 0; i < N; i++)
cin >> X[i] >> Y[i] >> D[i];
vector<int> ans = affonda(N, X, Y, D);
sort(begin(ans), end(ans));
for (auto x: ans)
cout << x << '\n';
}
컴파일 시 표준 에러 (stderr) 메시지
Main.cpp: In function 'std::pair<bool, int> trovaScontro(char, pii, char, pii)':
Main.cpp:88:1: warning: control reaches end of non-void function [-Wreturn-type]
88 | }
| ^| # | 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... |