小魂和他的数列

题目链接

题目大意

给出一个数列,让求长度为k的严格递增子序列有多少个

怎么做呢?
显然dp 这个是很好想的

for (int i=  1; i <= n; i ++ ){dp[i][1] =1;}for (int i = 2; i <= m; i ++ ){for(int j = i; j <= n; j ++ ){for (int  k = 1; k < j; k ++ ){if(a[k] < a[j]){dp[j][i] += dp[k][i-1];}}}}

这个dp显然tle 所以 当时没有做出来。 做到这里不会做了。。
想不到怎么优化。
显然在最里面的那个循环的作用是前缀和 (小于a[i]的位置的dp的前缀和)
于是你得想到树状数组优化。。 我太菜了想不到
开k个树状数组优化最里面的那一层循环
于是就得到先离散化再根据他的值加进去 再求前缀和加到dp里的操作
于是就写了个这个:

 for (int i = 1; i <= n; i ++ ){vis[i] = lower_bound(vv.begin(),vv.end(),a[i]) - vv.begin() + 1;}l = vv.size();for (int i=  1; i <= n; i ++ ){dp[i][1] =1;}for(int i = 2; i <= m; i ++ ){for (int j = 1; j <= n; j ++ ){add(vis[j],i - 1,dp[j][i-1]);dp[j][i] = (dp[j][i] + query(vis[j] - 1,i - 1))%mod;}}

本来只能过60% 加个vis数组预处理了一下离散化后的值
能过85%
可是这又不是他妈的oi赛制
还是a不了
于是参考了大佬博客了。。。
地址
代码:

#include<stdio.h>
#include<vector>
#include<algorithm>
using namespace std;
const int mod = 998244353;
const int maxn = 5e5+5;
int a[maxn];
int dp[maxn][11];
int tree[maxn][11];
int l;
int lowbit(int x)
{return x & (-x);
}
void add(int x,int f,int num)
{while( x <= l ){tree[x][f] = (tree[x][f] + num) % mod;x += lowbit(x);}
}
int query(int x,int f)
{int ans = 0;while(x > 0){ans =  (ans + tree[x][f])%mod;x -= lowbit(x);}return ans;
}
vector<int> vv;
int num[maxn];
int vis[maxn];
int temp[maxn];
int main()
{int n,m;scanf("%d%d",&n,&m);for(int i = 1; i <= n; i ++ ){scanf("%d",&a[i]);vv.push_back(a[i]);}sort(vv.begin(),vv.end());vv.erase(unique(vv.begin(),vv.end()),vv.end());for (int i = 1; i <= n; i ++ ){vis[i] = lower_bound(vv.begin(),vv.end(),a[i]) - vv.begin() + 1;}l = vv.size();``for (int i = 1; i <= n; i ++ ){num[vis[i]] ++ ;dp[vis[i]][1] = num[vis[i]];add(vis[i],1,1);for (int j = 2; j <= m; j ++ ){temp[j] = query(vis[i] - 1,j - 1);dp[vis[i]][j] = (dp[vis[i]][j] + temp[j])%mod;}for (int j = 2; j <= m; j ++ ){add(vis[i],j,temp[j]);}}int ans = 0;for (int i =1; i <= n ; i++ ){ans =(ans + dp[i][m]) %mod;}printf("%d\n",ans%mod);
}

牛客练习赛56 小魂和他的数列相关推荐

  1. 牛客练习赛 56 E tarjan 割边

    A - 小蒟和他的乐谱 签到题,将原序列对 7 取模之后将序列扫描一遍就可以得到答案 不过感觉题目意思还需要理解理解 #define IO ios::sync_with_stdio(false);ci ...

  2. 牛客练习赛56 A-小蒟和他的乐谱

    链接:https://ac.nowcoder.com/acm/contest/3566/A 来源:牛客网 题目描述 小蒟上音乐课的时候,老师说宫商角徵羽(分别对应C大调的do,re,mi,sol,la ...

  3. 牛客练习赛59 小松鼠吃松果(优化dp二维偏序)

    小松鼠吃松果 非常nicenicenice的一道题 首先考虑dpdpdp 容易想到按照时间来排序 然后定义dp[i]dp[i]dp[i]为考虑前iii个果子且吃掉第iii个的最大价值 那么每次都去前面 ...

  4. 牛客练习赛81 小Q与彼岸花 (分块+可持久化01trie)

    题意: 题解:因为这个题目是弱化以后的,正常的范围是5e4 . 看了官方题解去学习了一波可持久化01trie然后回来把这个题补完. 可持久数据结构其实就是我们的数据结构的内容会不断发生变化,而我们还要 ...

  5. 牛客练习赛77 小G的约数(整除分块)

    其中 1 有 n 个,2 有 n/2 个.......可以发现 :所以只要在一定时间内解决即可,由于可以利用整除分块解决 ,所以两遍递归即可 ll go(ll n) {return n*(n+1)/2 ...

  6. 牛客练习赛79E小G的数学难题

    https://ac.nowcoder.com/acm/contest/11169/E 挺有意思的一道题 可以考虑放缩 可以把每个aia_iai​放大,若仍然满足条件,那原问题也满足条件 同理把每个b ...

  7. 牛客练习赛7 E 珂朵莉的数列

    珂朵莉的数列 思路: 树状数组+高精度 离散化不知道哪里写错了,一直wa,最后用二分写的离散化 哪位路过大神可以帮我看看原来的那个离散化错在哪里啊 通过代码: import java.math.Big ...

  8. 牛客练习赛81 E. 小 Q 与函数求和 1( “简单莫比乌斯反演” ,欧拉函数性质)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 牛客练习赛81 E. 小 Q 与函数求和 1( "简单莫比乌斯反演" ) Prob ...

  9. 牛客练习赛34 E little w and Digital Root(数位dp)

    title: 牛客练习赛34 E little w and Digital Root(数位dp) date: 2018-12-17 22:38:37 tags: 数位dp categories:ACM ...

最新文章

  1. 数据结构实验之二叉树五:层序遍历(STL和模拟队列两种方法)
  2. Amazon Web Service 雲端運算平台攻略 【2】
  3. windows平台下压缩tar.gz
  4. C#会对于未赋值的变量/成员变量,给予一个初始值吗?
  5. 三、函数的嵌套、作用域链、函数名的应用、闭包。
  6. AtCoder Beginner Contest 223
  7. Linux 运维必备的13款实用工具,拿好了~
  8. 还原精灵密码算法分析
  9. MacOS串口调试工具minicom配置
  10. java毕业设计——基于java+JDBC+sqlserver的POS积分管理系统设计与实现(毕业论文+程序源码)——POS积分管理系统
  11. 前端图片格式与浏览器性能优化
  12. 学籍管理系统(C语言版)
  13. 今日的质量,明日的市场--谈谈软件登记测试
  14. 网络:抓包分析dns的原理
  15. Lcd(一)显示原理
  16. RT-Thread源码下载介绍
  17. 推荐100首值得听的英文歌【ZT】
  18. 网站nginx配置限制单个IP访问频率,预防DDOS恶意攻击
  19. VMWARE下的Ubuntu清理磁盘
  20. Debian/ubuntu 显示屏幕校准

热门文章

  1. 浏览器当前安全设置不允许发送html表单,当前安全设置不允许发送html表单。怎么办?...
  2. 不锈钢旗杆的制作与安装
  3. i3-1005g1怎么样
  4. 图解Google搜索技术(续)
  5. c盘里面java能不能删_c盘中的哪些文件不能删除?
  6. 邮件合并发送html,邮件合并HTML格式文本从数据库到Word文档
  7. Android Transition动画
  8. 软件测试需要学什么?
  9. 【光波电子学】期末复习资料汇总
  10. Firefox扩展中Keyconfig配置快捷键常用代码