Cod sursa(job #1005597)

Utilizator sleepaholicNeculaescu Theodor sleepaholic Data 5 octombrie 2013 12:46:11
Problema P-sir Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <fstream>
#include <algorithm>
#define MAXN 2005
using namespace std;
ifstream f("psir.in");
ofstream g("psir.out");

unsigned int n,v[MAXN],sum[MAXN][MAXN],ord[MAXN],x,nxt[MAXN],prv[MAXN],sol;

bool Comp(int a,int b){
    return v[a]<v[b];}

int main(){
    int i,j;
    f>>n;
    for(i=1;i<=n;i++){
        ord[i]=i;
        f>>v[i];}
    sort(ord+1,ord+n+1,Comp);
    for(i=1;i<=n;i++){
        for(j=i+1;j<=n&&v[ord[j]]==v[ord[i]];j++);
        nxt[ord[i]]=ord[j-1];
        for(j=i-1;j>0&&v[ord[j]]==v[ord[i]];j--);
        prv[ord[i]]=ord[j];}
    for(j=2;j<=n;j++){
        x=v[j];
        for(i=1;i<=n&&v[ord[i]]<x;i++){
            sum[ord[i]][j]=sum[ord[i-1]][j];
            if(ord[i]<j)
                sum[ord[i]][j]+=sum[ord[n]][ord[i]]-sum[nxt[j]][ord[i]]+1;}
        for(i;i<=n&&v[ord[i]]==x;i++){
            sum[ord[i]][j]=sum[ord[i-1]][j];
            if(ord[i]<j)
                sol++;}
        for(i;i<=n;i++){
            sum[ord[i]][j]=sum[ord[i-1]][j];
            if(ord[i]<j)
                sum[ord[i]][j]+=sum[prv[j]][ord[i]]+1;}
        sol+=sum[ord[n]][j];}
    g<<sol<<'\n';
    f.close();
    g.close();
    return 0;}