Cod sursa(job #2981948)

Utilizator oskar01oskar the boss oskar01 Data 19 februarie 2023 11:27:37
Problema P-sir Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.9 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <map>

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];
map<int,int> nr;


void read() {
    cin>>n;
    v.resize(n+1);
    for(int i=1;i<=n;i++) {
        cin>>v[i],nr[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 display(){
    cout << " v \n";
    for(int i =1 ; i <=n ; i++){
        cout << v[i] << " ";
    }
    cout<<"\n";
    cout << " map \n";
    for(auto x : nr){
        cout << x.second << " ";
    }
    cout<<"\n";
}

void norm(){
    int idx = 1;
    for(auto &x : nr){
        x.second = idx++;
    }
    for(int i=1;i<=n;i++) {
        v[i] = nr[v[i]];
    }
    //display();
}

void solve3(){
    norm();
    int res = 0,sum = 0;;
    for(int i = 1;i < n;i++) {
        for(int j = 1;j < i;j++) {
            sum = 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]%MOD;
            res %=MOD;
        }
    }
    cout << res%MOD;
}

void solve2(){
    norm();
    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];
                }
            }
            else 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]%MOD;
            res %=MOD;
        }
    }
    cout << res%MOD;
}

int32_t main() {
    read();
    solve2();
    return 0;
}