题目传送门

题目大意:给你一个序列,求出它所有区间的本质不同的子序列个数。(空序列也算作本质不同),数据范围$1e5$。

我们肯定是不能一个个枚举区间的...而且这个复杂度下,也就大概$O(n)$或$O(nlogn)$了...

然后...这是个计数类的dp。我们先尝试都搞上,然后再去重。

设$f[i]$表示$i$到$n$(即后缀)所有可能的子序列的个数和。

那么边界有$f[n]=2$。(最后一个元素+空序列),每次从$i+1$转移过来。

首先肯定有$f[i]=f[i+1]*2+2$。就是在$(i+1,i+1),(i+1,i+2),(i+1,i+3)...(i+1,n)$的前面加上或不加$ai$。再加上$(i,i)=2$。

之后考虑去重。如果$ai=aj$,那么对于很多子序列都是会有重复的,于是我们需要减去$f[j]+1$。(+1是$i$自身)

而对于如何找$j$的位置,我们可以用一个$nxt$数组来记录离当前最近的$a[i]$出现的位置。每次更新。因为$a[i]$范围到了$1e8$,考虑离散化。

Code

 #include<cstdio>
#include<algorithm>
#define maxn 100090 using namespace std;
typedef long long ll;
const ll moder=; int n,cnt;
int a[maxn],b[maxn],nxt[maxn];
ll ans,f[maxn]; int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&a[i]),b[i]=a[i];
sort(b+,b++n);
int cnt=unique(b+,b++n)-(b+);
for(int i=;i<=n;i++) a[i]=lower_bound(b+,b+cnt+,a[i])-b;
f[n]=;
nxt[a[n]]=n;
for(int i=n-;i>=;i--)
{
(f[i]=f[i+]*+)%=moder;
if(nxt[a[i]])
{
int pos=nxt[a[i]];
f[i]=(f[i]-f[pos+]-+moder)%moder;
}
nxt[a[i]]=i;
}
for(int i=;i<=n;i++)
(ans+=f[i])%=moder;
printf("%lld",ans%moder);
return ;
}

LuoguP1370 Charlie的云笔记序列 【dp】By cellur925的更多相关文章

  1. 72. Edit Distance(困难,确实挺难的,但很经典,双序列DP问题)

    Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2 ...

  2. [OpenJudge90][序列DP+乱搞]滑雪

    滑雪 总时间限制: 1000ms 内存限制: 65536kB [描述] Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次 ...

  3. 序列DP(输出有要求)

    DP Time Limit:10000MS     Memory Limit:165888KB     64bit IO Format:%lld & %llu Submit Status De ...

  4. hdoj5909 Tree Cutting(点分治+树上dp转序列dp)

    题目链接:https://vjudge.net/problem/HDU-5909 题意:给一颗树,结点带权值v[i]<m.求异或和为k的子树个数(0<=k<m). 思路: 首先点分治 ...

  5. 一类巧妙利用利用失配树的序列DP

    I.导入 求长度为\(\text{len}\)的包含给定连续子串\(\text{T}\)的 0/1 串的个数.(\(|T|<=15\)) 通常来说这种题目应该立刻联想到状压 DP 与取反集--这 ...

  6. 洛谷P1415 拆分数列[序列DP 状态 打印]

    题目背景 [为了响应党中央勤节俭.反铺张的精神,题目背景描述故事部分略去^-^] 题目描述 给出一列数字,需要你添加任意多个逗号将其拆成若干个严格递增的数.如果有多组解,则输出使得最后一个数最小的同时 ...

  7. UVA - 1625 Color Length[序列DP 代价计算技巧]

    UVA - 1625 Color Length   白书 很明显f[i][j]表示第一个取到i第二个取到j的代价 问题在于代价的计算,并不知道每种颜色的开始和结束   和模拟赛那道环形DP很想,计算这 ...

  8. 【BZOJ-1046】上升序列 DP + 贪心

    1046: [HAOI2007]上升序列 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3723  Solved: 1271[Submit][Stat ...

  9. 2014 Super Training #10 D 花生的序列 --DP

    原题: FZU 2170 http://acm.fzu.edu.cn/problem.php?pid=2170 这题确实是当时没读懂题目,连样例都没想通,所以没做了,所以还是感觉这样散漫的做不好,有些 ...

随机推荐

  1. STL 笔记(二) 关联容器 map、set、multimap 和 multimap

    STL 关联容器简单介绍 关联容器即 key-value 键值对容器,依靠 key 来存储和读取元素. 在 STL 中,有四种关联容器,各自是: map 键值对 key-value 存储,key 不可 ...

  2. 父节点parentNode

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  3. NS3网络仿真(7): Wifi节点

    快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 在上一节中.我们仿真了一个总线型网络,这一节尝试将上一节中的n0变成一个无线的AP.再连上几个节点 ...

  4. Beijing Bus

    Search: http://bjgj.aibang.com:8899 https://github.com/sp-chenyang/bus https://github.com/leavind/Co ...

  5. ok6410[000] 搭建裸机开发环境

    1.安装交叉工具链arm-linux-gcc-4.3.2 先把这个工具复制到rhat系统中[rhel-server-6.3-i386-dvd.iso] 解压arm-linux-gcc-4.3.2到一个 ...

  6. Redis实现消息的发布/订阅

    利用spring-boot结合redis进行消息的发布与订阅: 发布: class Publish { private static String topicName = “Topic:chat”; ...

  7. ubuntu搭建samba服务器

    一.为什么要用Samba?     Samba的主要任务就是实现Linux系统和Windows系统之间的资源共享.   二.需要的软件? 我是在ubuntu上实现的,所以我只需在配置好ubuntu的更 ...

  8. 查看 python安装目录

    打开终端 输入: which python 打开终端 依此输入: python import sys print sys.path

  9. IE8与vs2005冲突 添加MFC类向导错误解决方法—— internet explorer脚本错误

    IE8 与 VS2005 冲突问题解决方法 问题表现为: MFC类向导添加类时,出现“当前页面的脚本发生错误”,进入MFC类向导后上方有一个小黄条“此网站的某个加载项运行失败.请检查"Int ...

  10. DRF 之 认证组件

    1.认证的作用? 我们知道,当我们在网站上登陆之后,就会有自己的个人中心,之类的可以对自己的信息进行修改.但是http请求又是无状态的,所以导致我们每次请求都是一个新的请求,服务端每次都需要对请求进行 ...