P3970 [TJOI2014]上升子序列

news/2024/7/5 5:13:43

传送门

DP

十分显然的DP,但是不好写

设 f[ i ] 表示以第 i 个数作结尾时的方案数,原序列为 a

如果不考虑相同的序列:

  那么转移就是 Σ f[ j ] (0< j < i && a [ j ] < a [ i ])

  复杂度为 O(n^2)

  考虑优化:

    先去重 ,得到数组 b

    每次把f [ i ] 加到树状数组里 a [ i ]的值 在 b 中的位置 的位置

    那么 f [ i ] 就等于 query(a [ i ] 的值在 b 中的位置-1) (query为树状数组的询问操作)

    (上两行很重要,自己在脑子里想象一下,一定要理解原因)

然后考虑去掉相同的序列

很简单

只要每次更新完 f [ i ] 时把 f [ i ] 减去前面 a 中所有值为 a[ i ] 的位置(设为 j)

的 f[ j ]的和(还是要在脑子里想象一下...或者看代码来理解...

最后注意要减去长度为 1 的方案数以及一些细节

代码其实不长

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
const int N=1e5+7;
const int mo=1e9+7;
int n,a[N],f[N],b[N],t[N],las[N],m,ans;
//t是树状数组的数组,las[i]是前面a中所有值为a[i]的位置(设为j)的f[j]的和
inline int query(int x)
{
    int res=0;
    while(x)
    {
        res=(res+t[x])%mo;
        x-=x&-x;
    }
    return res;
}
inline void add(int x,int v)
{
    while(x<=m)
    {
        t[x]=(t[x]+v)%mo;
        x+=x&-x;
    }
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++) scanf("%d",&a[i]),b[i]=a[i];

    sort(b+1,b+n+1); m=unique(b+1,b+n+1)-b-1;//去重
    for(int i=1;i<=n;i++)
    {
        int k=lower_bound(b+1,b+m+1,a[i])-b;//找到a[i]在b中的位置

        f[i]=(f[i]+query(k-1)+1)%mo;
        f[i]-=las[k];
        if(f[i]<0) f[i]+=mo;

        ans=(ans+f[i])%mo; 
        add(k,f[i]);
        las[k]=(las[k]+f[i])%mo;
    }
    ans-=m; if(ans<0) ans+=mo;//减去长度为1的方案数
    cout<<ans;
    return 0;
}

 

转载于:https://www.cnblogs.com/LLTYYC/p/9651547.html


http://www.niftyadmin.cn/n/4557164.html

相关文章

C语言种根号怎么表示 比如(1-x)的二分之一次方

库函数sqrt(x)#include<math.h> 答案补充 sqrt(x)表示对x开平方

Oracle连接问题,报错无监听

在cmd命令下能成功连接的情况下&#xff1a; 把主机地址改为&#xff1a;127.0.0.1

什么地方可以购买到《word程序VC版》书籍

不是很清楚 你试试 网上的书店应该能买到吧 那里才是中国程序员的老巢 ||| 上淘宝看看... 这种书只有大城市才能买到 你去CSDN上看看吧 而且很难找 ||| 新华书店或者高等教育书店 ||| word开源了吗

1.6 MySQL 基础教程

http://www.w3school.com.cn/sql/index.asp 转载于:https://www.cnblogs.com/lijiejoy/p/9652317.html

tomcat项目发布

目标&#xff1a;把发布到 Tomcat 下的 Web 项目&#xff0c;访问路径去掉项目名称 方法 1&#xff1a; 原理&#xff1a;Tomcat 的默认根目录是 ROOT&#xff0c;实际上 ROOT 这个项目在实际生产环境是没有用的&#xff0c;所以我们可以用我们的项目覆盖 ROOT 项目 。 操作过…

关于C.K的故事。

关于c.k的资料真是少之又少 和异性玩精神上的恋爱 姓名&#xff1a;沉珂&#xff08;C.K&#xff09;  性别&#xff1a;女  星座&#xff1a;天秤座  血型&#xff1a;B型   故乡&#xff1a;湖南   生日&#xff1a;1987年10月22日   性向&#xff1a;双性恋 她爷…

Tomcat在idea控制台乱码问题

这种情况是tomcat的日志配置文件的编码需要修改&#xff0c;找到tomcat安装目录&#xff0c;找到conf下的logging.properties文件&#xff0c;将其中的encoding UTF-8的部分全部修改为encoding GBK&#xff0c;如图&#xff1a;

Unity3d发布IOS(包含u3d自带IAP内购)的流程-小白篇(四)-Xcode配置发布部分

上一篇&#xff1a;http://www.cnblogs.com/yzxhz/p/9618665.html 已经配置好了ios内购部分。加上原有开发的程序已经可以打包发布了。 本篇需要&#xff1a;mac电脑&#xff08;安装好xcode&#xff09;。 首先从unity进行打包&#xff0c;点击File>Build Setting> 选…