Cod sursa(job #2155485)

Utilizator ovidius11Stiriu Ovidius ovidius11 Data 7 martie 2018 21:08:10
Problema Numarare triunghiuri Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.91 kb
#include<cstdio>
#include<algorithm>
using namespace std;
long long aib[60005],v[805],f[30005];
long long update(long long nr){
long long i;
for(i=nr;i<=60000;i=i+(i&(-i)))
aib[i]++;}
long long query(long long nr){
long long i,s=0;
for(i=nr;i>0;i=i-(i&(-i)))
s=s+aib[i];
return s;}
int main(){
freopen("nrtri.in","r",stdin);
freopen("nrtri.out","w",stdout);
long long n,i,j,u;
long long rasp=0;
scanf("%lld",&n);
for(i=1;i<=n;i++)
scanf("%lld",&v[i]),f[v[i]]++;
sort(v+1,v+n+1);
for(i=1;i<=n;i++)
update(v[i]);
u=1;
for(i=2;i<=n;i++)
if (v[i]!=v[i-1])
v[++u]=v[i];
n=u;
for(i=1;i<=n;i++)
for(j=i;j<=n;j++)
if (v[i]!=v[j]){
rasp=rasp+(query(v[i]+v[j])-query(v[j]))*f[v[i]]*f[v[j]];
rasp=rasp+f[v[i]]*f[v[j]]*(f[v[j]]-1)/2;}
else
if (f[v[i]]>=2){
rasp=rasp+(query(v[i]+v[j])-query(v[j]))*f[v[i]]*(f[v[i]]-1)/2;
rasp=rasp+f[v[i]]*(f[v[i]]-1)*(f[v[i]]-2)/6;}
printf("%lld\n",rasp);
return 0;}