Cod sursa(job #2890282)

Utilizator Mike07Mihai-Alexandru Militaru Mike07 Data 15 aprilie 2022 10:13:58
Problema Secventa 5 Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.11 kb
#include<bits/stdc++.h>
using namespace std;
int n, L, U;
unsigned int v[(1<<20)+1];
unsigned int arr[(1<<20)+1];
int id[(1<<20)+1], ap[(1<<20)+1];
ifstream f("secv5.in");
ofstream g("secv5.out");

long long secv(int k){
    for(int i=0;i<n;i++){
        ap[i]=0;
    }
    long long max_nr_allowed=0, left=0, cnt=0;
    for(int i=0;i<n;i++){
        if(!ap[arr[i]]){
            max_nr_allowed++;
        }
        ap[arr[i]]++;
        while(max_nr_allowed>k){
            ap[arr[left]]--;
            if(ap[arr[left]]==0)max_nr_allowed--;
            left++;
        }
        cnt+=i-left+1;
    }
    return cnt;

}

bool cmp(int x, int y){
    return v[x]<v[y];
}

int main(){
    f>>n>>L>>U;
    for(int i=0;i<n;i++){
        f>>v[i];
        id[i]=i;
    }

    sort(id,id+n,cmp);
    arr[id[0]]=id[0];
    for(int i=1;i<n;i++){
        if(v[id[i]]==v[id[i-1]]){
            arr[id[i]]=arr[id[i-1]];
        }else{
            arr[id[i]]=i;
        }
    }
//    for(int i=0;i<n;i++)
//        cout<<arr[i]<<" ";
//    cout<<"\n";
    g<<secv(U)-secv(L-1);
    return 0;
}