Submission #655717

#TimeUsernameProblemLanguageResultExecution timeMemory
655717RichemCircle selection (APIO18_circle_selection)C++14
0 / 100
3061 ms316544 KiB
#include <iostream> #include <algorithm> #include <unordered_map> #include <vector> using namespace std; const int MAX_ALED = 3e5+42; struct Aled{ int xCentre, yCentre, rayon, id; bool ragequit = false; bool intersecte(Aled autre) { int x = xCentre - autre.xCentre, y = yCentre - autre.yCentre; return (x*x+y*y) <= (rayon + autre.rayon) * (rayon + autre.rayon); } bool operator<(Aled autre) { if(rayon == autre.rayon) return id < autre.id; return rayon > autre.rayon; } }; struct Position{ long long int x,y; long long int getId() { return (x << 32) + y; } }; int nbAled; Aled aled[MAX_ALED]; Aled triRayon[MAX_ALED]; void input() { cin >> nbAled; for(int iAled = 0; iAled < nbAled; iAled++) { cin >> aled[iAled].xCentre >> aled[iAled].yCentre >> aled[iAled].rayon; aled[iAled].xCentre += 1e9; aled[iAled].yCentre += 1e9; aled[iAled].id = iAled; } sort(aled, aled + nbAled); } unordered_map<long long int, vector<int>> enfer; Position quelCase[MAX_ALED]; void calcGrille(int taille) { enfer.clear(); for(int cur = 0; cur < nbAled; cur++) { int xCase = aled[cur].xCentre / taille, yCase = aled[cur].yCentre / taille; Position caseCur = {xCase, yCase}; enfer[caseCur.getId()].push_back(cur); quelCase[cur] = {xCase, yCase}; } } bool retire[MAX_ALED] = {0}; int rep[MAX_ALED]; int tailleGrille; int main() { input(); tailleGrille = (1 << 30); for(int curCercle = 0; curCercle < nbAled; curCercle++) { if(retire[curCercle]) continue; while(aled[curCercle].rayon < tailleGrille) { tailleGrille /= 2; calcGrille(tailleGrille); } for(int deltaX = -3; deltaX <= 3; deltaX++) { for(int deltaY = -3; deltaY <= 3; deltaY++) { int xCaseNouv = quelCase[curCercle].x + deltaX, yCaseNouv = quelCase[curCercle].y + deltaY; Position caseNouv = {xCaseNouv, yCaseNouv}; for(auto autreCercle : enfer[caseNouv.getId()]) { if(!retire[autreCercle] && aled[curCercle].intersecte(aled[autreCercle])) { retire[autreCercle] = 1; rep[aled[autreCercle].id] = aled[curCercle].id+1; } } } } } for(int curCercle = 0; curCercle < nbAled; curCercle++) { cout << rep[curCercle] << " "; } }
#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...