Mai intai trebuie sa te autentifici.
Cod sursa(job #2663019)
Utilizator | Data | 25 octombrie 2020 09:35:38 | |
---|---|---|---|
Problema | Secventa 5 | Scor | 100 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva de probleme | Marime | 1.7 kb |
#include <stdio.h>
#include <vector>
#define NMAX (1<<20)
#define MOD 666013
using namespace std;
unsigned v[NMAX];
int n;
struct elem {
unsigned a;
int rep;
};
vector<elem> myHash[MOD];
void resetHash() {
int i;
for ( i = 0; i < MOD; i++ )
myHash[i].clear();
}
bool adauga( unsigned x ) {
int n, cod, ret, i;
cod = x % MOD;
n = myHash[cod].size();
i = 0;
while ( i < n && myHash[cod][i].a != x )
i++;
if ( i == n ) {
myHash[cod].push_back( { x, 1 } );
ret = 1;
} else {
myHash[cod][i].rep++;
ret = 0;
}
return ret;
}
bool sterge( unsigned x ) {
int cod, ret, i;
cod = x % MOD;
i = 0;
while ( myHash[cod][i].a != x )
i++;
myHash[cod][i].rep--;
if ( myHash[cod][i].rep == 0 ) {
myHash[cod].erase( myHash[cod].begin() + i );
ret = 1;
} else
ret = 0;
return ret;
}
long long posib( int k ) {
int dist, i, j;
long long sol;
resetHash();
j = dist = sol = 0;
for ( i = 0; i < n; i++ ) {
dist += adauga( v[i] );
while ( j <= i && dist > k ) {
dist -= sterge( v[j] );
j++;
}
if ( dist <= k )
sol += i - j + 1;
}
if ( k == 0 )
sol = 0;
return sol;
}
int main() {
FILE *fin, *fout;
int l, u, i;
fin = fopen( "secv5.in", "r" );
fscanf( fin, "%d%d%d", &n, &l, &u );
for ( i = 0; i < n; i++ )
fscanf( fin, "%u", &v[i] );
fclose( fin );
fout = fopen( "secv5.out", "w" );
fprintf( fout, "%lld", posib( u ) - posib( l - 1 ) );
fclose( fout );
return 0;
}