Cod sursa(job #2974949)

Utilizator puica2018Puica Andrei puica2018 Data 4 februarie 2023 21:31:19
Problema P-sir Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("psir.in");
ofstream fout("psir.out");

const long long mod=(1LL<<32);

int n;
int p[2005];
int ps[2005];
unsigned int dp[2005][2005];

int fr[2005];

int main()
{
    fin>>n;
    for(int i=1; i<=n; i++)
    {
        fin>>p[i];
        ps[i]=p[i];
    }
    sort(ps+1,ps+n+1);
    for(int i=1; i<=n; i++)
    {
        int st=1,dr=n,mij,pos;
        while(st<=dr)
        {
            mij=(st+dr)/2;
            if(ps[mij]==p[i])
            {
                pos=mij;
                break;
            }
            if(ps[mij]<p[i])
                st=mij+1;
            else
                dr=mij-1;
        }
        p[i]=pos;
    }
    unsigned int ans=0;
    for(int i=1; i<=n; i++)
    {
        ans=(ans+fr[p[i]])%mod;
        fr[p[i]]++;
    }
    for(int i=1; i<=n; i++)
    {
        int x=p[i];
        unsigned int sum=1;
        for(int j=1; j+1<x; j++)
        {
            dp[x][j]=(dp[x][j]+sum)%mod;
            sum=(sum+dp[j][x])%mod;
        }
        dp[x][x-1]=(dp[x][x-1]+sum)%mod;
        sum=1;
        for(int j=n; j-1>x; j--)
        {
            dp[x][j]=(dp[x][j]+sum)%mod;
            sum=(sum+dp[j][x])%mod;
        }
        dp[x][x+1]=(dp[x][x+1]+sum)%mod;
        for(int j=1; j<=n; j++)
            ans=(ans+dp[j][x])%mod;
    }
    fout<<ans<<"\n";
    return 0;
}