Cod sursa(job #1789208)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 26 octombrie 2016 19:34:58
Problema P-sir Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <cstdio>
#include <algorithm>

#define MAXN 2000

unsigned int sum[MAXN+2][MAXN+2];
int v[MAXN+1], a[MAXN+1], fr[MAXN+1], k;

inline int max2(int a, int b){
    if(a>b) return a;
    else return b;
}

inline int cautbin(int x){
    int rez=0;
    for(int pas=1<<10; pas; pas>>=1) if((rez+pas<=k)&&(a[rez+pas]<=x)) rez+=pas;
    return rez;
}

int main(){
    int n;
    unsigned int ans, aux;
    FILE *fin, *fout;
    fin=fopen("psir.in", "r");
    fout=fopen("psir.out", "w");
    fscanf(fin, "%d", &n);
    for(int i=1; i<=n; i++){
        fscanf(fin, "%d", &v[i]);
        a[i]=v[i];
    }
    std::sort(a+1, a+n+1);
    k=1;
    for(int i=2; i<=n; i++) if(a[i]!=a[k]) a[++k]=a[i];
    for(int i=1; i<=n; i++) v[i]=cautbin(v[i]);
    for(int i=1; i<=n; i++) fr[v[i]]++;
    ans=0;
    for(int i=1; i<=k; i++) ans+=fr[i]*(fr[i]-1)/2;
    for(int i=n; i>0; i--){
        sum[i][v[i]]=1;
        for(int j=i+1; j<=n; j++){
            if(v[i]<v[j]) aux=sum[j][v[i]+1];
            else if(v[i]>v[j]) aux=sum[j][v[i]-1];
            else aux=0;
            sum[i][v[j]]+=aux;
            ans+=aux;
        }
        for(int j=v[i]+1; j<=k; j++) sum[i][j]+=sum[i][j-1];
        for(int j=v[i]-1; j>0; j--) sum[i][j]+=sum[i][j+1];
    }
    fprintf(fout, "%u\n", ans);
    fclose(fin);
    fclose(fout);
    return 0;
}