Cod sursa(job #2730399)

Utilizator PetyAlexandru Peticaru Pety Data 26 martie 2021 11:05:23
Problema P-sir Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.21 kb
	
#include <bits/stdc++.h>
#define ll long long
#define ui unsigned int
#define ld long double
 
using namespace std;
 
const ll mod = (1ll << 32);
const ll INF = 1e16;  
 
ifstream fin ("psir.in");
ofstream fout ("psir.out");
 
ll n, v[2002], a[2002];
unsigned int dp[2002][2002], ans;
unsigned int sum[2002][2002];
 
ui add (ll a, ll b) {
  a += b;
  if (a < 0)
    a -= mod;
  if (a >= mod)
    a -= mod;
  return a;
}

int main()   
{
  fin >> n;
  for (int i = 1; i <= n; i++) {
    fin >> v[i];
    a[i] = v[i];
  }
  sort(a + 1, a + n + 1);
  for (int i = 1; i <= n; i++)
    v[i] = lower_bound(a + 1, a + n + 1, v[i]) - a;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++)
      sum[i][j] = add(sum[i][j], sum[i][j - 1]);
    for (int j = i + 1; j <= n; j++) {
      if (v[i] == v[j]) {
        ans = add(ans, 1);
        continue;
      }
      if (v[i] > v[j]) {
        dp[i][j] = add(dp[i][j], sum[i][v[j] - 1]);
      }
      else {
        ll val = sum[i][n] - sum[i][v[j]];
        if (val >= mod)  val -= mod;
        dp[i][j] = add(dp[i][j], val);
      }
      dp[i][j] = add(dp[i][j], 1);
      sum[j][v[i]] += dp[i][j];
      ans = add(ans, dp[i][j]);
    }
  }
  fout << ans << "\n";
  return 0;
}