Cod sursa(job #858240)

Utilizator repp4raduRadu-Andrei Szasz repp4radu Data 18 ianuarie 2013 18:33:32
Problema Secventa 5 Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.59 kb
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <vector>

#define MAX 1050000
#define HMAX 200097
#define PII pair<unsigned int, int>
#define f first
#define s second
#define pb push_back
#define mp make_pair

using namespace std;

int N, L, U, lCnt, rCnt, poz;
long long sol;
unsigned int V[MAX];
vector< PII > leftAp[HMAX], rightAp[HMAX];
char buff[MAX];

inline void add(const unsigned int &val, vector< PII > H[], int &cnt)
{
    int key = val % HMAX; bool found = false;
    for(size_t i = 0; i < H[key].size(); i++)
        if(H[key][i].f == val)
        {
            found = true;
            H[key][i].s++;
            break;
        }
    if(!found) H[key].pb(mp(val, 1)), cnt++;
}

inline void rmv(const unsigned int &val, vector< PII > H[], int &cnt)
{
    int key = val % HMAX;
    for(size_t i = 0; i < H[key].size(); i++)
        if(H[key][i].f == val)
        {
            if(--H[key][i].s == 0)
            {
                cnt--;
                H[key].erase(H[key].begin() + i);
            }
            return;
        }
}

void cit(unsigned int &X)
{
    X = 0;
    while(buff[poz] < '0' || buff[poz] > '9')
        if(++poz == MAX) fread(buff, 1, MAX, stdin), poz = 0;
    while(buff[poz] >= '0' && buff[poz] <= '9')
    {
        X = X * 10 + buff[poz++] - '0';
        if(poz == MAX) fread(buff, 1, MAX, stdin), poz = 0;
    }
}

void cit(int &X)
{
    X = 0;
    while(buff[poz] < '0' || buff[poz] > '9')
        if(++poz == MAX) fread(buff, 1, MAX, stdin), poz = 0;
    while(buff[poz] >= '0' && buff[poz] <= '9')
    {
        X = X * 10 + buff[poz++] - '0';
        if(poz == MAX) fread(buff, 1, MAX, stdin), poz = 0;
    }
}

int main()
{
    freopen("secv5.in", "r", stdin); fread(buff, 1, MAX, stdin); cit(N); cit(L); cit(U);
    for(int i = 1; i <= N; i++) cit(V[i]);
    fclose(stdin);
    for(int i = 1, left = 1, right = 1; i <= N && (right <= N || rCnt >= L); i++)
    {
        for(; left <= N; left++)
        {
            add(V[left], leftAp, lCnt);
            if(lCnt == L)
            {
                rmv(V[left], leftAp, lCnt);
                break;
            }
        }
        for(; right <= N && rCnt <= U; right++)
        {
            add(V[right], rightAp, rCnt);
            if(rCnt > U)
            {
                rmv(V[right], rightAp, rCnt);
                break;
            }
        }
        sol += (right - left);
        rmv(V[i], leftAp, lCnt); rmv(V[i], rightAp, rCnt);
    }
    ofstream out("secv5.out"); out<<sol<<"\n"; out.close();
    return 0;
}