CF1591F Non-equal Neighbours
容斥,记 表示 的答案。
记 表示 ,记 为 的前缀和。
然后单调栈维护点 左边第一个小于等于它的数位置 ,则转移方程为:。
时间复杂度 。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define ha putchar(' ')
#define he putchar('\n')
inline int read()
{
int x = 0;
char c = getchar();
while (c < '0' || c > '9')
c = getchar();
while (c >= '0' && c <= '9')
x = (x << 3) + (x << 1) + (c ^ 48), c = getchar();
return x;
}
inline void write(int x)
{
if(x > 9)
write(x / 10);
putchar(x % 10 + 48);
}
const int _ = 5e5 + 10, mod = 998244353;
int n, a[_], t, sk[_];
ll f[_], s[_];
signed main()
{
n = read();
for(int i = 1; i <= n; ++i) a[i] = read();
f[1] = s[1] = -a[1], sk[++t] = 1;
for(int i = 2; i <= n; ++i)
{
while(t && a[sk[t]] > a[i]) t--;
if(t == 0) f[i] = -a[i] * (s[i - 1] + 1) % mod;
else f[i] = (f[sk[t]] - a[i] * (s[i - 1] - s[sk[t] - 1])) % mod;
s[i] = (s[i - 1] + f[i]) % mod;
sk[++t] = i;
}
write(((n & 1 ? -1 : 1) * f[n] % mod + mod) % mod), he;
return 0;
}
本文来自博客园,作者:蒟蒻orz,转载请注明原文链接:https://www.cnblogs.com/orzz/p/18121994