Cod sursa(job #3225012)

Utilizator Botnaru_VictorBotnaru Victor Botnaru_Victor Data 16 aprilie 2024 19:47:28
Problema P-sir Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.45 kb
#include <bits/stdc++.h>
using namespace std;

///----------TOGGLES
#define FIO
#define LONGER
//#define TESTS

///---------

#ifdef LONGER
    #define int unsigned int
#endif // LONGER

#ifdef FIO
    const string fname="psir";
    ifstream in(fname+".in");
    ofstream out(fname+".out");
    #define cin in
    #define cout out
#endif // FIO

///--------

#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);

///-------STL++-----
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define sz(x) x.size()
#define pb(x,y) x.push_back(y)
#define mp(x,y) make_pair(x,y)
#define fr(i,n) for(int i=1;i<=n;i++)
using ll = long long;
using ld = long double;
using pii = pair<int,int>;
using pdd = pair<double, double>;
using veci = vector<int>;
using vecp = vector<pii>;
template<typename T> using PQ = priority_queue<T, vector<T>, greater<T> >;

///-----CODE GOES HERE-----

const int maxn = 2005;
int dmare[maxn][maxn];
int dmic[maxn][maxn];
int v[maxn];
int n;
void solve()
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>v[i];

    int maxval=0;
    {
        map<int,int> nor;
        for(int i=1;i<=n;i++) nor[v[i]]=0;
        for(auto &e:nor)
        {
            e.second=++maxval;
        }
        for(int i=1;i<=n;i++) v[i]=nor[v[i]];
    }
    //reverse(v+1, v+n+1);

    int ans=0;
    for(int i=1;i<=n;i++)
    {
        dmare[i][maxval+1]=1;
        dmic[i][0]=1;
        for(int j=i-1;j>=1;j--)
        {
            //cerr<<"here "<<i<<' '<<j<<' '<<v[i]<<' '<<v[j]<<'\n';

            if(v[j]>v[i])  dmare[i][v[j]]+=dmic[j][v[i]-1], dmic[i][v[j]]+=dmic[j][v[i]-1];
            else if(v[j]<v[i]) dmic[i][v[j]]+=dmare[j][v[i]+1], dmare[i][v[j]]+=dmare[j][v[i]+1];
            else ans=ans+1;
        }
        for(int j=1;j<=maxval;j++)
        {
            dmic[i][j]=(dmic[i][j]+dmic[i][j-1]);
            dmare[i][maxval+1-j]=(dmare[i][maxval+1-j]+dmare[i][maxval+2-j]);
        }
        ans=(ans+dmic[i][maxval]);
        //cout<<i<<' '<<v[i]<<' '<<dmic[i][maxval]<<'\n';
    }

    /*for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=maxval;j++)
        {
            cout<<dmic[i][j]<<','<<dmare[i][j]<<' ';
        }
        cout<<'\n';
    }*/
    cout<<ans-n<<'\n';
}

///---MAIN FUNC-------

int32_t main()
{
    IOS;
    int t=1;
    #ifdef TESTS
        cin>>t;
    #endif // TESTS
    while(t--)
    {
        solve();
    }
    return 0;
}