Cod sursa(job #2439292)

Utilizator lucametehauDart Monkey lucametehau Data 15 iulie 2019 16:21:56
Problema P-sir Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <fstream>
#include <algorithm>
#define ui unsigned int

using namespace std;

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

ui n, m, ans;

ui v[2005], w[2005];
ui dp[2005][2005];

ui search(ui val) {
  ui st = 1, dr = m, mid;
  while(st <= dr) {
    mid = (st + dr) >> 1;
    if(w[mid] <= val)
      st = mid + 1;
    else
      dr = mid - 1;
  }
  return dr;
}

int main() {
  cin >> n;
  for(int i = 1; i <= n; i++) {
    cin >> v[i];
    w[i] = v[i];
  }
  // normalizare
  sort(w + 1, w + n + 1);
  m = 1;
  for(int i = 2; i <= n; i++) {
    if(w[i] != w[i - 1])
      w[++m] = w[i];
  }
  for(int i = 1; i <= n; i++)
    v[i] = search(v[i]);
  // dinamica...
  for(int i = 2; i <= n; i++) {
    for(int j = 1; j <= i - 1; j++) {
      if(v[i] > v[j])
        dp[i][v[j]] += dp[j][m] - dp[j][v[i]] + 1;
      else if(v[i] < v[j])
        dp[i][v[j]] += dp[j][v[i] - 1] + 1;
      else
        dp[i][v[j]]++;
    }
    for(int j = 1; j <= m; j++)
      ans += dp[i][j], dp[i][j] += dp[i][j - 1];
  }
  cout << ans;
  return 0;
}