LuoguP1370 Charlie的云笔记序列 【dp】By cellur925
题目大意:给你一个序列,求出它所有区间的本质不同的子序列个数。(空序列也算作本质不同),数据范围$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的更多相关文章
- 72. Edit Distance(困难,确实挺难的,但很经典,双序列DP问题)
Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2 ...
- [OpenJudge90][序列DP+乱搞]滑雪
滑雪 总时间限制: 1000ms 内存限制: 65536kB [描述] Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次 ...
- 序列DP(输出有要求)
DP Time Limit:10000MS Memory Limit:165888KB 64bit IO Format:%lld & %llu Submit Status De ...
- hdoj5909 Tree Cutting(点分治+树上dp转序列dp)
题目链接:https://vjudge.net/problem/HDU-5909 题意:给一颗树,结点带权值v[i]<m.求异或和为k的子树个数(0<=k<m). 思路: 首先点分治 ...
- 一类巧妙利用利用失配树的序列DP
I.导入 求长度为\(\text{len}\)的包含给定连续子串\(\text{T}\)的 0/1 串的个数.(\(|T|<=15\)) 通常来说这种题目应该立刻联想到状压 DP 与取反集--这 ...
- 洛谷P1415 拆分数列[序列DP 状态 打印]
题目背景 [为了响应党中央勤节俭.反铺张的精神,题目背景描述故事部分略去^-^] 题目描述 给出一列数字,需要你添加任意多个逗号将其拆成若干个严格递增的数.如果有多组解,则输出使得最后一个数最小的同时 ...
- UVA - 1625 Color Length[序列DP 代价计算技巧]
UVA - 1625 Color Length 白书 很明显f[i][j]表示第一个取到i第二个取到j的代价 问题在于代价的计算,并不知道每种颜色的开始和结束 和模拟赛那道环形DP很想,计算这 ...
- 【BZOJ-1046】上升序列 DP + 贪心
1046: [HAOI2007]上升序列 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3723 Solved: 1271[Submit][Stat ...
- 2014 Super Training #10 D 花生的序列 --DP
原题: FZU 2170 http://acm.fzu.edu.cn/problem.php?pid=2170 这题确实是当时没读懂题目,连样例都没想通,所以没做了,所以还是感觉这样散漫的做不好,有些 ...
随机推荐
- C#模拟登录Twitter 发送私信、艾特用户、回复评论
这次做成了MVC程序的接口 private static string UserName = "用户名"; private static string PassWord = &qu ...
- openssl 再爆惊天漏洞及紧急修复指南
openssl 又摊上大事了,2014年6月5日,SSL/TLS Man-in-the-Middle Vulnerability 该漏洞使得攻击者能够拦截恶意中间节点加密和解密数据.同一时候强迫使用弱 ...
- mvn -v 报错解决办法
由于近期公司需求,我找到了个maven教程:http://wentao365.iteye.com/blog/903396 安装maven其实很简单,就是在Apache官网下载需要的maven包,然后配 ...
- MD5加密实现类不是Windows平台下联邦信息处理标准验证过的加密算法的一部分
在.NET应用程序中,MD5CryptoServiceProvider实例化时,造成This implementation is not part of the Windows Platform FI ...
- 初始化master节点时,日志内容分析
root@master:~/code/shell# kubeadm init --image-repository registry.aliyuncs.com/google_containers ++ ...
- HDU4513 吉哥系列故事——完美队形II Manacher算法
题目链接:https://vjudge.net/problem/HDU-4513 吉哥系列故事——完美队形II Time Limit: 3000/1000 MS (Java/Others) Me ...
- 逻辑运算符,if、swtch语句(java基础知识三)
1.逻辑运算符的基本用法 * A:逻辑运算符有哪些 &(逻辑与) |(逻辑或) !(逻辑非) ^(逻辑异或) &&(短路与) ||(短路或) * 注意事项: * a:逻辑运算符 ...
- JavaScript实现Map、Reduce和Filter
1. [代码][JavaScript]代码 <script type="text/javascript">// 函数式编程:// 描述我们要做什么,而不是我们如 ...
- [原创]java调用PageOffice生成word
一.在开发OA办公或与文档相关的Web系统中,难免会遇到动态生成word文档的需求,为了解决工作中遇到导出word文档的需求,前一段时间上网找了一些资料,在word导出这方面有很多工具可以使用,jac ...
- python-dev 安装错误
/******************************************************************** * python-dev 安装错误 * 说明: * 今天在安 ...