tsy的排列/赤壁之战
求折线形子序列个数
典型树状数组优化dp
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <ctime>
#define ll long long
using namespace std;
const int N=3e5+10;
const int mod=35198030;
int read()
{
int x=0,f=0,c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return f?-x:x;
}
int n,f[N][5];
int a[N];
struct TREE
{
int t[N];
int lowbit(int x){ return x&(-x);}
void add(int x,int y){ for(;x<=n;x+=lowbit(x))t[x]=((ll)t[x]+y)%mod;}
int query(int x){ int ans=0;for(;x;x-=lowbit(x)) ans=((ll)t[x]+ans)%mod; return ans;}
}t1,t2,t3;
int main()
{
n=read();
for(int i=1;i<=n;i++) a[i]=read();
f[1][1]=1;
t1.add(a[1],1);// t2.add(n-a[1]+1,1); t3.add(a[1],1);
for(int i=2;i<=n;i++)
{
f[i][1]=1;
f[i][2]=t1.query(a[i]);
f[i][3]=t2.query(n-a[i]+1);
f[i][4]=t3.query(a[i]);
t1.add(a[i],f[i][1]); t2.add(n-a[i]+1,f[i][2]); t3.add(a[i],f[i][3]);
}
int ans=0;
for(int i=1;i<=n;i++) ans=((ll)ans+f[i][4])%mod;
printf("%d",ans);
return 0;
}

浙公网安备 33010602011771号