Submission #1080702

#TimeUsernameProblemLanguageResultExecution timeMemory
1080702oscar1fNaval battle (CEOI24_battle)C++17
Compilation error
0 ms0 KiB
#include<bits/stdc++.h> using namespace std; #define int long long struct intersect { int distParc,premBat,deuzBat; bool operator < (const intersect& autre) const { return distParc>autre.distParc; } }; const int MAX_BAT=200*1000+5,INFINI=1000*1000*1000+5; int nbBat; pair<int,int> coord[MAX_BAT]; int direc[MAX_BAT],dateInter[MAX_BAT]; set<int> listeVal[4]; unordered_map<int,int> reNum[4]; vector<pair<int,int>> corres; set<pair<int,int>> posBat[MAX_BAT][6]; priority_queue<intersect> possi; vector<vector<bool>> pris={{false,true,true,false}, {true,false,false,true}, {false,true,false,true}, {false,false,true,true}, {true,true,false,false}, {true,false,true,false}}; vector<int> numHache={0,0,1,2,2,3}; vector<pair<int,int>> pente={{1,1}, {1,1}, {0,1}, {1,-1}, {1,-1}, {1,0}}; vector<pair<int,int>> combin={{1,0}, {1,0}, {1,0}, {1,0}, {1,0}, {0,1}}; int calcInter(int bat1,int bat2) { int dist=0; if (coord[bat1].first==coord[bat2].first) { dist=abs(coord[bat1].second-coord[bat2].second)/2; } else if (coord[bat1].second==coord[bat2].second) { dist=abs(coord[bat1].first-coord[bat2].first)/2; } else if (abs(coord[bat1].first-coord[bat2].first)==abs(coord[bat1].second-coord[bat2].second)) { dist=abs(coord[bat1].first-coord[bat2].first); } else { return INFINI; } if (coord[bat1].first+dist*corres[direc[bat1]].first==coord[bat2].first+dist*corres[direc[bat2]].first and coord[bat1].second+dist*corres[direc[bat1]].second==coord[bat2].second+dist*corres[direc[bat2]].second) { return dist; } return INFINI; } void init(int idSom,int idSens) { int taille=posBat[idSom][idSens].size(); if (taille==0) { return; } auto it=posBat[idSom][idSens].begin(); int bat1,bat2,dist; for (int i=0;i<taille-1;i++) { bat1=(*it).second; it++; bat2=(*it).second; dist=calcInter(bat1,bat2); if (dist!=INFINI) { possi.push({dist,bat1,bat2}); } } } void suppr(int idSom,int idSens,int batSup,int som) { auto it=posBat[idSom][idSens].lower_bound({som,batSup}); if (it==posBat[idSom][idSens].end() or (*it)!={som,batSup}) { return; } posBat[idSom][idSens].erase(it); it=posBat[idSom][idSens].lower_bound({coord[batSup].first,batSup}); if (it==posBat[idSom][idSens].end() or it==posBat[idSom][idSens].begin()) { return; } int bat1,bat2=(*it).second,dist; it--; bat1=(*it).second; dist=calcInter() dist=calcInter(bat1,bat2); if (dist!=INFINI) { possi.push({dist,bat1,bat2}); } } void calc(vector<int> numBat) { int taille=numBat.size(); set<pair<int,int>> posBat; for (int i:numBat) { posBat.insert({coord[i].first,i}); } priority_queue<pair<int,int>> possi; auto it=posBat.begin(); int bat1,bat2,batSup; for (int i=0;i<taille-1;i++) { bat1=(*it).second; it++; bat2=(*it).second; if (direc[bat1]==1 and direc[bat2]==2) { possi.push({-(coord[bat2].first-coord[bat1].first),bat1}); } } while (!possi.empty()) { batSup=possi.top().second; possi.pop(); it=posBat.lower_bound({coord[batSup].first,batSup}); posBat.erase(it); it=posBat.lower_bound({coord[batSup].first,batSup}); posBat.erase(it); it=posBat.lower_bound({coord[batSup].first,batSup}); if (it!=posBat.end()) { bat2=(*it).second; if (it!=posBat.begin()) { it--; bat1=(*it).second; if (direc[bat1]==1 and direc[bat2]==2) { possi.push({-(coord[bat2].first-coord[bat1].first),bat1}); } } } } for (auto i:posBat) { cout<<i.second<<"\n"; } } void maj(int batSup,int dist) { dateInter[batSup]=dist; for (int i=1;i<=nbBat;i++) { for (int j=0;j<6;j++) { if (pris[j][direc[i]]) { suppr(reNum[numHache[j]][coord[i].first*pente[j].first+coord[i].second*pente[j].second],j,i,coord[i].first*combin[j].first+coord[i].second*combin[j].second); } } } } signed main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); corres={{0,-1},{1,0},{0,1},{-1,0}}; cin>>nbBat; char carac; for (int i=1;i<=nbBat;i++) { cin>>coord[i].first>>coord[i].second>>carac; if (carac=='N') { direc[i]=0; } if (carac=='E') { direc[i]=1; } if (carac=='S') { direc[i]=2; } if (carac=='W') { direc[i]=3; } listeVal[0].insert(coord[i].first+coord[i].second); listeVal[1].insert(coord[i].second); listeVal[2].insert(coord[i].first-coord[i].second); listeVal[3].insert(coord[i].first); dateInter[i]=INFINI; } int numDeCeType; for (int i=0;i<4;i++) { numDeCeType=0; for (int j:listeVal[i]) { reNum[i][j]=numDeCeType; numDeCeType++; } } for (int i=1;i<=nbBat;i++) { for (int j=0;j<6;j++) { if (pris[j][direc[i]]) { posBat[reNum[numHache[j]][coord[i].first*pente[j].first+coord[i].second*pente[j].second]][j].insert({coord[i].first*combin[j].first+coord[i].second*combin[j].second,i}); } } } for (int i=0;i<nbBat;i++) { for (int j=0;j<6;j++) { init(i,j); } } int bat1,bat2,dist; while (!possi.empty()) { dist=possi.top().distParc; bat1=possi.top().premBat; bat2=possi.top().deuzBat; possi.pop(); if (dateInter[bat1]>=dist and dateInter[bat2]>=dist) { maj(bat1,dist); maj(bat2,dist); } } for (int i=1;i<=nbBat;i++) { if (dateInter[i]==INFINI) { cout<<i<<"\n"; } } return 0; }

Compilation message (stderr)

Main.cpp: In function 'void suppr(long long int, long long int, long long int, long long int)':
Main.cpp:85:51: error: expected primary-expression before '{' token
   85 |     if (it==posBat[idSom][idSens].end() or (*it)!={som,batSup}) {
      |                                                   ^
Main.cpp:85:51: error: expected ')' before '{' token
   85 |     if (it==posBat[idSom][idSens].end() or (*it)!={som,batSup}) {
      |        ~                                          ^
      |                                                   )
Main.cpp:96:20: error: too few arguments to function 'long long int calcInter(long long int, long long int)'
   96 |     dist=calcInter()
      |                    ^
Main.cpp:44:5: note: declared here
   44 | int calcInter(int bat1,int bat2) {
      |     ^~~~~~~~~