Htio bih se ovom prilikom osvrnuti na neobične test podatke za ovaj zadatak. Dugo sam rješavao ovaj zadatak i optimizirao misleći da nešto krivo radim.
Pogledajte kod i zamjetite što sam izkomentirao jer u suprotnom ne prolazi time limit na zadnjem test primjeru.
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <queue>
#include <cmath>
#include <climits>
using namespace std;
#define pb(x) push_back(x)
int N, T;
int polje[200][200] = { 0 };
vector < pair < int, int > > stabla, sstabla;
inline int minimum( int a, int b ) { return ( a > b ) ? b : a; }
int nadji_najveci_kv( int x1, int y1 ) {
int ret = 1, minn = minimum( x1, y1 );
for( int i = 0; i < N - minn; ++i ) {
int x2 = x1 + i;
int y2 = y1 + i;
bool valid = true;
if( ( x2 > N ) || ( y2 > N ) ) break;
for( int j = 0; j < stabla.size(); ++j ) {
/*if( stabla[j].first >= x1 && stabla[j].first <= x2 &&
stabla[j].second >= y1 && stabla[j].second <= y2 ) { valid = false; break; }*/
if( sstabla[j].first >= y1 && sstabla[j].first <= y2 &&
sstabla[j].second >= x1 && sstabla[j].second <= x2 ) { valid = false; break; }
}
if( valid ){ ret = i+1; }
}
return ret;
}
bool cmp( pair < int, int > a, pair < int, int > b ) {
return a.first > b.second;
}
int main() {
scanf( "%d %d", &N, &T );
stabla.resize( T );
for( int i = 0; i < T; ++i ) {
int a, b; scanf( "%d %d", &a, &b );
polje[--a][--b] = 1;
//stabla.pb( make_pair( a, b ) );
sstabla.pb( make_pair( b, a ) );
}
//sort( stabla.begin(), stabla.end());
sort( sstabla.begin(), sstabla.end());
int sol = 0;
for( int i = 0; i < N; ++i )
for( int j = 0; j < N; ++j )
if( !polje[i][j] ) {
int tmp = nadji_najveci_kv( i, j );
sol >?= tmp;
j += tmp;
}
cout << sol << endl;
/*sort( stablax.begin(), stablax.end());
for( int i = 0; i < stablax.size(); ++i )
cout << stablax[i].first << " " << stablax[i].second << endl;*/
return 0;
}
Pogledajte kod i zamjetite što sam izkomentirao jer u suprotnom ne prolazi time limit na zadnjem test primjeru.
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <queue>
#include <cmath>
#include <climits>
using namespace std;
#define pb(x) push_back(x)
int N, T;
int polje[200][200] = { 0 };
vector < pair < int, int > > stabla, sstabla;
inline int minimum( int a, int b ) { return ( a > b ) ? b : a; }
int nadji_najveci_kv( int x1, int y1 ) {
int ret = 1, minn = minimum( x1, y1 );
for( int i = 0; i < N - minn; ++i ) {
int x2 = x1 + i;
int y2 = y1 + i;
bool valid = true;
if( ( x2 > N ) || ( y2 > N ) ) break;
for( int j = 0; j < stabla.size(); ++j ) {
/*if( stabla[j].first >= x1 && stabla[j].first <= x2 &&
stabla[j].second >= y1 && stabla[j].second <= y2 ) { valid = false; break; }*/
if( sstabla[j].first >= y1 && sstabla[j].first <= y2 &&
sstabla[j].second >= x1 && sstabla[j].second <= x2 ) { valid = false; break; }
}
if( valid ){ ret = i+1; }
}
return ret;
}
bool cmp( pair < int, int > a, pair < int, int > b ) {
return a.first > b.second;
}
int main() {
scanf( "%d %d", &N, &T );
stabla.resize( T );
for( int i = 0; i < T; ++i ) {
int a, b; scanf( "%d %d", &a, &b );
polje[--a][--b] = 1;
//stabla.pb( make_pair( a, b ) );
sstabla.pb( make_pair( b, a ) );
}
//sort( stabla.begin(), stabla.end());
sort( sstabla.begin(), sstabla.end());
int sol = 0;
for( int i = 0; i < N; ++i )
for( int j = 0; j < N; ++j )
if( !polje[i][j] ) {
int tmp = nadji_najveci_kv( i, j );
sol >?= tmp;
j += tmp;
}
cout << sol << endl;
/*sort( stablax.begin(), stablax.end());
for( int i = 0; i < stablax.size(); ++i )
cout << stablax[i].first << " " << stablax[i].second << endl;*/
return 0;
}