Cod sursa(job #2981870)

Utilizator oskar01oskar the boss oskar01 Data 18 februarie 2023 21:22:33
Problema P-sir Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

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

int n;
vector<int> v;

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;
}

int main() {
 
    read();
    solve();
    return 0;
}