Pagini recente » Cod sursa (job #1815129) | Cod sursa (job #1864418) | Cod sursa (job #1221312) | Cod sursa (job #6679) | Cod sursa (job #2043091)
#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;
}