Pagini recente » Cod sursa (job #915549) | Cod sursa (job #2642914) | Cod sursa (job #1044064) | Cod sursa (job #329640) | Cod sursa (job #378091)
Cod sursa(job #378091)
#include <fstream>
#include <cstdlib>
#include <ctime>
using namespace std;
const int MAXN = 1 << 20;
const int SHIFT = 14;
const int MAXH = 1 << (32-SHIFT);
const int MAXC = 6;
int N, X, Y, R;
long long Sol;
unsigned int A[MAXN];
unsigned int H[2][MAXH][MAXC];
int C[2][MAXH][MAXC];
int addToHash(int w, unsigned int x)
{
int v = (x * R) >> SHIFT, i;
for (i = 0; C[w][v][i] != 0; ++i)
if (H[w][v][i] == x)
{
++C[w][v][i];
return 0;
}
H[w][v][i] = x;
C[w][v][i] = 1;
return 1;
}
int removeFromHash(int w, unsigned int x)
{
int v = (x * R) >> SHIFT;
for (int i = 0; C[w][v][i] != 0; ++i)
if (H[w][v][i] == x)
{
--C[w][v][i];
if (C[w][v][i]) return 0;
int j = i;
while (C[w][v][j+1] != 0) ++j;
H[w][v][i] = H[w][v][j];
C[w][v][i] = C[w][v][j];
C[w][v][j] = 0;
return 1;
}
return 0;
}
long long solve(int w, int X)
{
int cnt = 0;
long long res = 0;
R = (rand() << 1) | 1;
for (int i = 1, j = 1; i <= N; ++i)
{
cnt += addToHash(w, A[i]);
for (; j <= i && cnt > X; ++j) cnt -= removeFromHash(w, A[j]);
res += i-j+1;
}
return res;
}
int main()
{
ifstream fin("secv5.in");
ofstream fout("secv5.out");
srand(time(0));
fin >> N >> X >> Y;
for (int i = 1; i <= N; ++i) fin >> A[i];
Sol = solve(0, Y) - solve(1, X-1);
fout << Sol << endl;
return 0;
}