Cod sursa(job #1904651)

Utilizator Mada2003Madalina Scarlat Mada2003 Data 5 martie 2017 18:27:35
Problema P-sir Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.06 kb
#include<fstream>
#include<cmath>
#include<algorithm>

using namespace std;

int h[2010],b[2010],a[2010],m[2010][2010],start[2010],sum[2010],res;
int i,j,n,nr=0,t,u;
bool ok;
int cmp(int i, int j)
{
    return a[i]<a[j];
}
int main()
{
    ifstream cin ("psir.in");
    ofstream cout ("psir.out");
    cin>>n;
    for(i=1; i<=n; ++i)
    {
        cin>>a[i];
        h[i]=i;
    }
    sort(h+1,h+n+1,cmp);
    i=1;
    while(i<=n)
    {
        start[++nr]=i;
        j=i;
        while(a[h[i]]==a[h[i+1]])
            ++i;
        for(t=j; t<=i; ++t)
            b[h[t]]=nr;
        ++i;
    }
    start[nr+1]=n+1;
    for(i=1; i<n; ++i)
    {
        t=start[b[i]+1];
        ok=0;
        while(!ok&&t<=n)
        {
            if(h[t]>i)
                ok=1;
            else
                ++t;
        }
        if(ok)
        {
            for(j=1; j<i; ++j)
                if(a[j]>a[h[t]])
                    m[i][h[t]]+=m[j][i];
            for(j=t+1; j<=n; ++j)
            {
                m[i][h[j]]=m[i][h[j-1]];
                if(a[h[j]]!=a[h[j-1]])
                    for(u=start[b[h[j]]]; u<start[b[h[j+1]]]; ++u)
                        if(h[u]<i)
                            m[i][h[j]]-=m[h[u]][i];
            }
        }
        t=start[b[i]]-1;
        ok=0;
        while(!ok&&t)
        {
            if(h[t]>i)
                ok=1;
            else
                --t;
        }
        if(ok)
        {
            for(j=1; j<i; ++j)
                if(a[j]<a[h[t]])
                    m[i][h[t]]+=m[j][i];
            for(j=t-1; j; --j)
            {
                m[i][h[j]]=m[i][h[j+1]];
                if(a[h[j]]!=a[h[j+1]])
                    for(u=start[b[h[j]]]; u<start[b[h[j+1]]]; ++u)
                        if(h[u]<i)
                            m[i][h[j]]-=m[h[u]][i];
            }
        }
        for(j=i+1; j<=n; ++j)
            ++m[i][j];
    }
    for(i=1; i<n; ++i)
        for(j=i+1; j<=n; ++j)
            res+=m[i][j];
    cout<<res<<"\n";
    return 0;
}