Pesca bizzarra

Salve a tutti.

Mi servirebbe una mano per questo problema (che credevo relativamente semplice).
La mia idea credo sia corretta: elimino le zone pescose che sicuramente non potrò più raggiungere.
Determino le zone da eliminare immaginando dei “rettangoli” che vengono definiti dagli spostamenti a destra (nel caso della prima riga di comandi) e dagli spostamenti in alto (nel caso della seconda riga).
Per aiutarmi a determinare le zone in modo efficiente creo due array delle pescosità: uno ordinato secondo la i e uno ordinato secondo la j.

Lascio il codice che ho scritto (con dei commenti) nella speranza che gli errori derivino da qualche mia svista:

#include <cstdio>
#include <algorithm>
using namespace std;
/*
************************ IDEA ************************
1)Elimino tutte le pescosita' che stanno strettamente a SX
  della posizione iniziale

2)Prima riga di comandi:
-Se mi muovo in alto non faccio nulla
-Se mi muovo verso destra elimino tutti i quadrati pescosi
 che stanno strettamente al disopra del segmento vecchiaPos-nuovaPos

3)Elimino tutte le pescisita' che stanno strettamente a DX
  della posizione finale e strettamente in basso alla posizione iniziale
  
4)Seconda riga di comandi:
-Se mi muovo in alto elimino tutti i quadrati pescosi
 che stanno strettamente a destra del segmento vecchiaPos-nuovaPos
-Se mi muovo verso destra non faccio nulla

5)Conto quante pescosita' mi sono rimaste, stampo e chiudo

*/

const int MAXP=1000005;

struct MAT{
	int i, j, pos;
}Pi[MAXP], Pj[MAXP], att, start, end;

int P, c;
bool occ[MAXP];

bool cmp1(const MAT&, const MAT&);
bool cmp2(const MAT&, const MAT&);

int main()
{
	freopen("input.txt","r",stdin);
	freopen("output.txt","w",stdout);
	
	//Salvo . . .
	scanf("%d %d %d", &P, &start.i, &start.j);
	att=start;
	for(int i=0; i<P; i++){
		scanf("%d %d", &(Pj[i].i), &(Pj[i].j));
		Pi[i]=Pj[i];
		Pi[i].pos=Pj[i].pos=i;
	}
	 //Ordino . . .
	sort(Pi,Pi+P,cmp1);
	sort(Pj,Pj+P,cmp2);
	
	int h;
	
	//Elimino a SX della casella A . . .
	for(h=0; h<P && Pi[h].i<att.i; h++)
			 occ[ Pi[h].pos ]=true;
	
	//Prima riga di comandi . . .
	do{
		scanf("%d", &c);
		if(c>0) att.j+=c;
		else{
			att.i-=c;
			while(h<P && Pi[h].i<att.i){
				if(Pi[h].j>att.j)
			 	         occ[ Pi[h].pos ]=true;
				h++;
			}
		}
	}while(c!=0);
	
	//Elimino la striscia sopra alla casella B
	//e tutto cio' che gli sta a DX . . .
	for(h; h<P; h++)
		if(Pi[h].i>att.i || (Pi[h].i==att.i && Pi[h].j>att.j))
			occ[ Pi[h].pos ]=true;
	
	//Riparto da A . . .
	att=start;
	
	//Elimino tutto cio' che e' al disotto della casella A . . .
	for(h=0; h<P && Pj[h].j<att.j; h++)
			 occ[ Pj[h].pos ]=true;
	
	//Seconda riga di comandi . . .
	do{
		scanf("%d", &c);
		if(c>0){
			att.j+=c;
			while(h<P && Pj[h].j<att.j){
				if(Pj[h].i>att.i)
			 	         occ[ Pj[h].pos ]=true;
				h++;
			}
		}
		else att.i-=c;
	}while(c!=0);
	
	//Non serve inizializzare c, e' gia' a zero.
	//Conto le caselle pescose che si sono "salvate" . . .
	for(h=0; h<P; h++)
			 if(!occ[h])
 			     c++;
	
	//Stampo e ciao! :D
	printf("%d\n", c);
	
	return 0;
}

bool cmp1(const MAT &m1, const MAT &m2)
{
	if(m1.i!=m2.i) return m1.i<m2.i;
	return m1.j>m2.j;
}

bool cmp2(const MAT &m1, const MAT &m2)
{
	if(m1.j!=m2.j) return m1.j<m2.j;
	return m1.i>m2.i;
}

( http://pastebin.com/xaY06MVA )

Credo che tu abbia fatto il mio stesso errore: la prima barca non è sempre quella che va verso l’alto :wink:

LOL.

Ora vedo di sistemare.

EDIT: comunque grazie mi hai fatto capire quanto stupido sono certe volte xD

Ecco perchè non usciva… pure io mi ero inventato questa assunzione che non c’era da nessuna parte… Grazie per il suggerimento! :D