Pagini recente » Cod sursa (job #2396790) | Cod sursa (job #600886) | Cod sursa (job #1291563) | Cod sursa (job #2891918) | Cod sursa (job #751458)
Cod sursa(job #751458)
#include <fstream>
#include <algorithm>
using namespace std;
const char InFile[]="psir.in";
const char OutFile[]="psir.out";
const int MaxN=2048;
ifstream fin(InFile);
ofstream fout(OutFile);
int N,V[MaxN],VN[MaxN];
unsigned int PSUM[MaxN][MaxN];
inline int Search(int val)
{
int first=1;
for(int step=MaxN;step;step>>=1)
{
int index=first+step;
if(index<=VN[0])
{
if(VN[index]<=val)
{
first=index;
}
}
}
return first;
}
int main()
{
fin>>N;
for(register int i=1;i<=N;++i)
{
fin>>V[i];
VN[i]=V[i];
}
fin.close();
sort(VN+1,VN+1+N);
VN[0]=1;
for(register int i=2;i<=N;++i)
{
if(VN[i]!=VN[VN[0]])
{
VN[++VN[0]]=VN[i];
}
}
for(register int i=1;i<=N;++i)
{
V[i]=Search(V[i]);
}
unsigned int sol=0;
for(register int i=2;i<=N;++i)
{
for(register int j=1;j<i;++j)
{
unsigned int curr=1;
if(V[i]<V[j])
{
curr+=PSUM[j][V[i]-1];
}
else if(V[i]>V[j])
{
curr+=PSUM[j][VN[0]]-PSUM[j][V[i]];
}
PSUM[i][V[j]]+=curr;
sol+=curr;
}
for(register int j=1;j<=VN[0];++j)
{
PSUM[i][j]+=PSUM[i][j-1];
}
}
fout<<sol;
fout.close();
return 0;
}