Cod sursa(job #2984836)

Utilizator oskar01oskar the boss oskar01 Data 24 februarie 2023 23:26:49
Problema P-sir Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

ifstream cin("psir.in");
ofstream cout("psir.out");

#define int long long

int n;
const int MOD = 4294967295;
vector<int> v;
int dp[2005][2005];

void read() {
    cin>>n;
    v.resize(n+1);
    for(int i=1;i<=n;i++) {
        cin>>v[i];
    }
}

int bs_lower(int val) {
    int l=1,r=n,mid,res=-1;
    while(l<=r) {
        mid=l+(r-l)/2;
        if(v[mid]<val) {
            res=mid;
            l=mid+1;
        }
        else {
            r=mid-1;
        }
    }
    return res;
}

int bs_greater(int val) {
    int l=1,r=n,mid=0,res=-1;
    while(l<=r) {
        mid=l+(r-l)/2;
        if(v[mid]>val) {
            res=mid;
            r=mid-1;
        }
        else {
            l=mid+1;
        }
    }
    return res;
}

void solve() {
    sort(v.begin()+1,v.end());
    // for(int i=1;i<=n;i++) {
    //     cout<<v[i]<<" ";
    // }
    // cout<<"\n\n";
    int res=((n)*(n-1))/2;
    for(int i=1;i<=n;i++) {
        while(i+1<=n && v[i+1]==v[i]) {
            i++;
        }
        int lw=bs_lower(v[i]),gr=bs_greater(v[i]);
        if(lw>-1 && gr>-1) {
            res+=lw*(n-gr+1);
        }
    }
    cout<<res;
}
void solve2(){
    int res = 0;
    for(int i=1;i<=n;i++) {
        for(int j=i+1;j<=n;j++) {
            dp[i][j] = 1;
            if (v[j] > v[i]){
                for(int k=1;k<=i;k++){
                    dp[i][j] += (v[k] > v[j]) * dp[k][i];
                }
            }

            if (v[j] < v[i]){
                for(int k=1;k<=i;k++){
                    dp[i][j] += (v[k] < v[j]) * dp[k][i];
                }
            }

            res += dp[i][j];
        }
    }
    cout << res%MOD;
}
int32_t main() {
    read();
    solve2();
    return 0;
}