Pagini recente » Cod sursa (job #360833) | Cod sursa (job #2611670) | Cod sursa (job #225154) | Cod sursa (job #675715) | Cod sursa (job #463601)
Cod sursa(job #463601)
#include<fstream>
using namespace std;
unsigned int h[2010],b[2010],a[2010],m[2010][2010],start[2010],sum[2010],res;
unsigned int i,j,n,nr=0,t,u;
bool ok;
int cmp(int i, int j)
{
return a[i]<a[j];
}
int main()
{
ifstream read ("psir.in");
ofstream write ("psir.out");
read>>n;
for(i=1;i<=n;++i)
{
read>>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];
write<<res<<'\n';
return 0;
}