Anno Luce testcase 022 e 024

il codice funziona per tutti i testcase a parte il 022 ed il 024

#include <vector>
#include <iostream>
#include <fstream>
#include <cmath>
#include <algorithm>

using namespace std;

int main(){
	long long int i, j, j1, j2, a, b;
	vector<long long int> x, y, z, d;
	vector<double> distanza_sole;
	ifstream in;
	in.open("input.txt");
	{
		in>>a;
		for(i=0; i<a; i++){
			in>>j>>j1>>j2;
			x.push_back(j);
			y.push_back(j1);
			z.push_back(j2);
		}
		in>>b;
		for(i=0; i<b; i++){
			in>>j;
			d.push_back(j);
		}
	}
	in.close();
    double distanza;
	for(i=0; i<a; i++){
		distanza= sqrt(pow(x[i]-0,2)+pow(y[i]-0,2)+pow(z[i]-0,2));
		distanza_sole.push_back(distanza); 
	}
	sort(distanza_sole.begin(), distanza_sole.end());
	vector<double>::iterator up;
	ofstream out("output.txt");
	for(i=0; i<b; i++){
		up = upper_bound(distanza_sole.begin(), distanza_sole.end(), d[i]);
		out<<(up - distanza_sole.begin())<<endl;
	}
	out.close();
}

non riesco a capire come mai non funziona per quei due testcase, soprattutto il 22 lo risolve se al posto dei double metto float (ma in questo modo non risolve altri testcase per overflow)

Per evitare errori di precisione puoi usare i long long e tenerti il quadrato delle distanze al posto che le distanze effettive (ovviamente devi elevare al quadrato anche la distanza che ti da nelle query).

Ho provato a farlo ma non funziona comunque visto che se faccio in questo modo risulta errore in molti più testcase rispetto al mio (compresi i casi d’esempio). con un punteggio di 20/100

Sostituendo
distanza= sqrt(pow(x[i]-0,2)+pow(y[i]-0,2)+pow(z[i]-0,2));
con
distanza= sqrt(x[i]*x[i]+y[i]*y[i]+z[i]*z[i]);
fa 100.
Il mio consiglio è non usare mai pow se devi elevare per una potenza intera (soprattutto se devi elevare alla seconda) in quanto perde precisione ed è lento :upside_down_face: