题解:CF1585F Non-equal Neighbours
很牛的题,感觉我的做法特魔怔,故写题解记之。
首先我们有一个朴素的二维 DP,我们设
特别地,若
这样我们得到了一个
由于
若
若
我们只需使用单调栈对于每一个
#include<bits/stdc++.h>
#define int long long
#define gc getchar
//char buf[1<<20],*p1,*p2;
//#define gc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin),p1==p2)?EOF:*p1++)
#define R read()
using namespace std;
int read()
{
int x=0,f=1;
char c=gc();
while(c>'9'||c<'0'){if(c=='-') f=-1;c=gc();}
while(c>='0'&&c<='9') x=(x<<1)+(x<<3)+c-48,c=gc();
return x*f;
}
void write(int x,char xx)
{
static int st[35],top=0;
if(x<0){x=-x;putchar('-');}
do
{
st[top++]=x%10,x/=10;
}while(x);
while(top) putchar(st[--top]+48);
putchar(xx);
}
#define N 200010
#define mod 998244353
int n,a[N],f[N],l[N],s[N];
vector<int>v;
signed main()
{
n=R;
for(int i=1;i<=n;i++) a[i]=R;
for(int i=n;i>=1;i--)
{
while(v.size()&&a[v.back()]>=a[i]) l[v.back()]=i,v.pop_back();
v.push_back(i);
}
f[1]=s[1]=a[1]%mod;
for(int i=2;i<=n;i++)
{
f[i]=s[i-1];
if(l[i]) (f[i]+=mod-s[l[i]-1])%=mod;
if(i&1) f[i]=mod-f[i];
((f[i]%=mod)+=mod)%=mod;
f[i]=f[i]*a[i]%mod,(f[i]+=(((i&1)^(l[i]&1))?-1:1)*(l[i]?f[l[i]]:-a[i])+mod)%=mod,s[i]=(s[i-1]+(i&1?f[i]:mod-f[i]))%mod;
}
write(f[n],'\n');
return 0;
}