Cod sursa(job #1181144)

Utilizator assa98Andrei Stanciu assa98 Data 1 mai 2014 21:56:38
Problema Secventa 5 Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <fstream>
#include <iostream>
#include <algorithm>
#include <vector>
#include <unordered_set>
using namespace std;

ifstream fin("secv5.in");
ofstream fout("secv5.out");

const int MAX_N=(1<<20)+100;

unsigned int v[MAX_N];
int d1[MAX_N];
int d2[MAX_N];
int n;

void get(int x,int d[MAX_N]) {
    if(x==0) {
        return;
    }
    int dist=0;
    unordered_multiset<unsigned int> S;
    for(int i=1; i<=n && dist<=x; i++) {
        if(S.count(v[i])>0) {
            S.insert(v[i]);
        }
        else {
            if(dist==x) {
                break;
            }
            else {
                S.insert(v[i]);
                dist++;
            }
        }
    }
    d[1]=S.size();
    for(int i=2;i<=n;i++) {
        S.erase(S.find(v[i-1]));
        d[i]=d[i-1]-1;
        if(S.count(v[i-1])==0) {
            dist--;
            while(i+d[i]<=n && dist<=x) {
                if(S.count(v[i+d[i]])) {
                    S.insert(v[i+d[i]]);
                }
                else {
                    if(dist==x) {
                        break;
                    }
                    else {
                        S.insert(v[i+d[i]]);
                        dist++;
                    }
                }
                d[i]++;
            }
        }
    }
}

int main() {
    int a,b;
    fin>>n>>a>>b;
    for(int i=1;i<=n;i++) {
        fin>>v[i];
    }


    get(a-1,d1);
    get(b,d2);

    long long ans=0;
    for(int i=1; i<=n; i++) {
        ans+=d2[i]-d1[i];
    }

    fout<<ans;

    return 0;
}