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;
}
posted @ 2022-02-16 14:46  __iostream  阅读(42)  评论(0)    收藏  举报