Cod sursa(job #712087)

Utilizator dacyanMujdar Dacian dacyan Data 13 martie 2012 00:54:31
Problema Secventa 5 Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <string>
#define MOD 666013
#define DIM (1 << 20) + 1
using namespace std;

typedef unsigned long long LL;
ofstream fout("secv5.out");


LL n, L, U, norm;
vector<vector<LL> > G;
vector<pair<LL, LL> > b;
LL a[DIM];
vector<short int> f;

LL Secv(LL);


int main()
{
    ifstream fin("secv5.in");
    fin >> n >> L >> U;
    LL x;
	string s;
	fin.get();
    for (LL i = 1; i <= n; ++i)
    {
        fin >> s;
		
		x = 0;
		for (int j = 0; j < s.size(); ++j)
			x = x * 10 + s[j] - '0';
        b.push_back(make_pair(x, i));
    }
    fin.close();
    
    sort(b.begin(), b.end());
    for (LL i = 0; i < b.size(); ++i)
        if (!i || b[i].first != b[i-1].first) 
                a[b[i].second] = ++norm;
        else 
                a[b[i].second] = norm;
    
    fout << Secv(U) - Secv(L-1)  << '\n';
    fout.close();
    return 0;
}    

LL Secv(LL dim)
{
	f.clear();
	f.resize(norm+1, 0);
    if (!dim) return 0;
    LL sol(0), nr(0);
    G.clear(); G.resize(MOD);
    for (LL st = 1, dr = 1; dr <= n; ++dr)
    {
        if (!f[a[dr]]) nr++;
        f[a[dr]]++;
        while (nr > dim)
        {
            f[a[st]]--;
            if (!f[a[st]]) 
                        nr--;
            st++;
        }
        sol += dr - st + 1;
    }
    return sol;
}