Pagini recente » Cod sursa (job #2590448) | Cod sursa (job #33146) | Cod sursa (job #2404759) | Cod sursa (job #1868815) | Cod sursa (job #2408025)
#include <bits/stdc++.h>
using namespace std ;
const int NR = 5005 , oo = 5005 ;
ofstream out ("secv.out") ;
int v [ NR ] , p [ NR ] , n , r [ NR ] , cnt = 1 , sw [ NR ] , sol = oo ;
vector < int > d ( NR , oo ) ;
inline bool cmp ( const int i , const int j ) {
return v [ i ] < v [ j ] ;
}
class InParser {
private:
FILE *fin;
char *buff;
int sp;
char read_ch() {
++sp;
if (sp == 4096) {
sp = 0;
fread(buff, 1, 4096, fin);
}
return buff[sp];
}
public:
InParser(const char* nume) {
fin = fopen(nume, "r");
buff = new char[4096]();
sp = 4095;
}
InParser& operator >> (int &n) {
char c;
while (!isdigit(c = read_ch()) && c != '-');
int sgn = 1;
if (c == '-') {
n = 0;
sgn = -1;
} else {
n = c - '0';
}
while (isdigit(c = read_ch())) {
n = 10 * n + c - '0';
}
n *= sgn;
return *this;
}
InParser& operator >> (long long &n) {
char c;
n = 0;
while (!isdigit(c = read_ch()) && c != '-');
long long sgn = 1;
if (c == '-') {
n = 0;
sgn = -1;
} else {
n = c - '0';
}
while (isdigit(c = read_ch())) {
n = 10 * n + c - '0';
}
n *= sgn;
return *this;
}
};
int main ()
{
InParser in ("secv.in") ;
int i ;
in >> n ;
for ( i = 1 ; i <= n ; ++ i ) {
in >> v [ i ] ;
p [ i ] = i ;
}
sort ( p + 1 , p + n + 1 , cmp ) ;
r [ p [ 1 ] ] = 1 ;
for ( i = 2 ; i <= n ; ++ i ) {
if ( v [ p [ i ] ] != v [ p [ i - 1 ] ] )
r [ p [ i ] ] = ++ cnt ;
else
r [ p [ i ] ] = cnt ;
} // r este de fapt v normalizat
// sw [ i ] - ultima pozitie pe care apare i daca exista subsirul 1 - i
for ( i = 1 ; i <= n ; ++ i ) {
if ( r [ i ] == 1 ) sw [ 1 ] = i , d [ 1 ] = 1 ;
if ( sw [ r [ i ] - 1 ] ) d [ r [ i ] ] = i - sw [ r [ i ] - 1 ] + d [ r [ i ] - 1 ] , sw [ r [ i ] ] = i ;
if ( r [ i ] == cnt ) sol = min ( sol , d [ cnt ] ) ;
}
if ( sol == oo ) out << -1 ;
else out << sol ;
}