Rectangle(Funziona teoricamente, praticamente no)

#include<bits/stdc++.h>
#include<vector>
using namespace std;

int main(){
	long long int n,m=1;
	bool k=false,f=false;
	cin>>n; 
	vector<long long int> v(n);
	for(long long int i=0 ; i<n; i++){
		cin>>v[i];
	}
	sort(v.begin(),v.end());
	reverse(v.begin(),v.end());
	for(long long int i=0;i<v.size();i++){
		if(v[0]==v[1]){
			m*=v[0];
			v.erase(v.begin());
			v.erase(v.begin());
			if(k){
				f=true;
			}
			k=true;
		}
		else
			v.erase(v.begin());
	}
	if(k&&f)
		cout<<m; 
	else
		cout<<0;
	return 0;
}

Non capisco perchè non funziona, qualche aiuto?

Non entro per ora nel merito della logica, tuttavia ti faccio notare che eliminare il primo elemento di un std::vector richiede tempo lineare nella dimensione del vettore (perché bisogna spostare tutti gli elementi a destra), dunque la complessità di questa soluzione è \mathcal{O}(N^2), troppo alta per prendere punteggio pieno.
Inoltre in alcuni punti stai accedendo a posizioni del vettore che potrebbero non esistere.

Se vuoi un consiglio te lo stai complicando più del necessario ad esempio perché invece che rimuovere gli elementi (che ti rallenta molto) non utilizzi un indice che ti dica fino a che posizione sei arrivato a controllare?

Non da errori di tempo ma di output

Il problema l’ho risolto sin da subito in questo modo, ma non capivo perchè mi desse output errato, per quanto riguarda il tempo non da problemi

il problema potrebbe essere che stai utilizzando v.size() come controllo nel for, ma poi all’ interno di esso stai rimuovendo elementi dal Vector, cambiando il valore di v.size()

Prova con questo input:
8
3 2 3 5 6 5 4 8

I testcase di questo problema sono estremamente deboli e lasciano passare una variante aggiustata di questa soluzione nonostante la complessitĂ  quadratica.
Ciononostante mi sembra che sia giusto farti notare che la complessità computazionale di questa soluzione è troppo alta perché questa soluzione possa prendere 100/100 con dei testcase fatti bene.

Per quando riguarda gli errori di logica nella tua soluzione:

for(long long int i=0;i<v.size();i++){

Chiaramente questo è buggato, lì ti servirebbe un while che controlla la dimensione di v

Inoltre dovresti uscire dal ciclo quando trovi il secondo valore: ora come ora stai moltiplicando ogni volta che trovi una coppia di valori uguali.

In ogni caso ti consiglio di provare a implementare questa soluzione con complessità \mathcal{O}(N\log N) al posto dell’attuale implementazione \mathcal{O}(N^2)

1 Mi Piace