Cod sursa(job #1052389)

Utilizator CosminRusuCosmin Rusu CosminRusu Data 11 decembrie 2013 11:08:08
Problema Secventa 5 Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <string.h>

using namespace std;

const char infile[] = "secv5.in";
const char outfile[] = "secv5.out";

ifstream cin(infile);
ofstream cout(outfile);

const int MAXN = (1 << 20) + 1;
const int oo = 0x3f3f3f3f;

int N, L, U;
unsigned int Hash[MAXN], HashKey[MAXN];
vector <pair<int, int> > v;

inline bool addHash(const unsigned int &valueToAdd) {
    if(++ Hash[valueToAdd] > 1)
        return false;  /// more than to valueToAdd in Hash
    return true;
}

inline bool eraseHash(const unsigned int &valueToErase) {
    if(-- Hash[valueToErase] > 0)
        return false;
    return true;  /// nothing left here
}

inline long long check(const int &maxDistinct) {
    for(int i = 0 ; i < MAXN ; ++ i)  Hash[i] = 0;
    long long ret = 0;
    for(unsigned int right = 0,  left = 0, distinctElements = 0 ; right < N ; ++ right) {
        if(addHash(HashKey[right]))
            ++ distinctElements;
        while(distinctElements > maxDistinct) {
            if(eraseHash(HashKey[left]))
                -- distinctElements;
            ++ left;
        }
        if(distinctElements <= maxDistinct)
            ret += right - left + 1;
    }
    return ret;
}

int main() {
    cin >> N >> U >> L;
    for(int i = 0 ; i < N ; ++ i) {
        int x;
        cin >> x;
        v.push_back(make_pair(x, i));
    }
    stable_sort(v.begin(), v.end());
    int counter = 0;
    HashKey[v[0].second] = 0;
    for(int i = 1 ; i < N ; ++ i) {
        if(v[i].first == v[i-1].first)
            HashKey[v[i].second] = HashKey[v[i-1].second];
        else HashKey[v[i].second] = ++ counter;
    }
    long long Ans1 = check(L);
    long long Ans2 = check(U - 1);
    cout << Ans1 - Ans2 << '\n';
    cin.close();
    cout.close();
    return 0;
}