Cod sursa(job #2043091)

Utilizator ionanghelinaIonut Anghelina ionanghelina Data 19 octombrie 2017 17:11:33
Problema P-sir Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include<bits/stdc++.h>
#define maxN 2005
using namespace std;
int a[maxN],v[maxN],n;
pair<int,int> p[maxN];
long long dp[maxN][maxN],sol;
int main()
{
    freopen("psir.in","r",stdin);
    freopen("psir.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&v[i]);
    /**
       dp[i][j]=numarul de subsiruri terminate in pozitia i, care sa aiba v[j] ca penultim element
    **/
    for(int i=1;i<=n;i++)
    {
        a[i]=v[i];
    }
    sort(a+1,a+n+1);
    for(int i=1;i<=n;i++)
    {
        p[i]={v[i],i};
    }
    sort(p+1,p+n+1);
    int cnt=0;
    for(int i=1;i<=n;i++)
    {
        if(i==1 || p[i].first!=p[i-1].first) cnt++;
        v[p[i].second]=cnt;
    }

   /* for(int i=1;i<=n;i++)
        cerr<<v[i]<<' ';*/

    for(int i=2;i<=n;i++)
    {
        for(int j=1;j<i;j++)
        {
            if(v[j]<v[i])
            {
                dp[i][v[j]]+=(dp[j][cnt]-dp[j][v[i]]);
                sol=sol+dp[j][cnt]-dp[j][v[i]];
            }
                else
            if(v[j]>v[i])
            {
                dp[i][v[j]]+=(dp[j][v[i]-1]);
                sol=sol+dp[j][v[i]-1];
            }
            dp[i][v[j]]++;
            sol++;
        }
        for(int j=2;j<=cnt;j++)
            dp[i][j]+=dp[i][j-1];
    }

//    for(int i=1;i<=n;i++)
  //  {
    //    for(int j=1;j<=cnt;j++) sol=sol+dp[i][j];
    //}
    printf("%d\n",sol);
    return 0;
}