题解:CF2144E1 Looking at Towers (easy version)
- E1
容易先处理出
接下来考虑 DP。设
考虑转移,对于当前的数
当统计答案时,需要小心重复计算的情况。因此当
时间复杂度为
void solve ()
{
int n = read (),mx = 0;
vector <int> a (n + 1),L (n + 1),R (n + 1);
vector <vector <int>> dp1 (n + 1,vector <int> (n + 1)),dp2 (n + 2,vector <int> (n + 2));
for (int i = 1;i <= n;++i) a[i] = read ();
int cntL = 0,cntR = 0;
for (int i = 1;i <= n;++i)
if (mx < a[i]) L[++cntL] = a[i],mx = a[i];
mx = 0;
for (int i = n;i;--i)
if (mx < a[i]) R[++cntR] = a[i],mx = a[i];
dp1[0][0] = dp2[n + 1][0] = 1;
for (int i = 1;i <= n;++i)
{
for (int j = cntL;~j;--j)
{
if (L[j] == a[i]) dp1[i][j] = (dp1[i - 1][j] * 2 % MOD + dp1[i - 1][j - 1]) % MOD;
else if (L[j] > a[i]) dp1[i][j] = dp1[i - 1][j] * 2 % MOD;
else dp1[i][j] = dp1[i - 1][j];
}
}
for (int i = n;i >= 1;--i)
{
for (int j = cntR;~j;--j)
{
if (R[j] == a[i]) dp2[i][j] = (dp2[i + 1][j] * 2 % MOD + dp2[i + 1][j - 1]) % MOD;
else if (R[j] > a[i]) dp2[i][j] = dp2[i + 1][j] * 2 % MOD;
else dp2[i][j] = dp2[i + 1][j];
}
}
ll ans = 0;
for (int i = 1;i <= n;++i)
{
if (a[i] != mx) continue;
ans = (ans + 1ll * ((dp1[i][cntL] - dp1[i - 1][cntL] + MOD) % MOD) * dp2[i + 1][cntR - 1] % MOD) % MOD;
}
printf ("%lld\n",ans);
}