正题


题目大意

一个由1∼n1\sim n1∼n组成的序列
求长度为k的上升序列的个数。
数据保证随机


解题思路

用fi,jf_{i,j}fi,j​表示长度为i,以j结尾的上升序列个数。
然后
fi,j=∑fi−1,k(aj>ak,j>k)f_{i,j}=\sum f_{i-1,k}(a_j>a_k,j>k)fi,j​=∑fi−1,k​(aj​>ak​,j>k)
这是O(n3)O(n^3)O(n3)
我们需要优化,所以我们可以用树状数组,下标表示值。
然后每次加fi−1,jf_{i-1,j}fi−1,j​进去,然后用查询到a[j]−1a[j]-1a[j]−1的前缀和。
这程序就变成了O(n2log2n)O(n^2\ log_2\ n)O(n2 log2​ n)
但是依旧不能过,这时我们就要用随机的性质。
因为最长不上升子序列的期望长度为n\sqrt nn​个,所以我们可以如果得出该长度的答案为0时,证明这已经是最长的了,所以我们可以以后的都输出0
那么时间复杂度期望为:O(nnlog2n)O(n\sqrt n\ log_2\ n)O(nn​ log2​ n)


code

#pragma GCC optimize(2)
%:pragma GCC optimize(3)
%:pragma GCC optimize("Ofast")
%:pragma GCC optimize("inline")
%:pragma GCC optimize("-fgcse")
%:pragma GCC optimize("-fgcse-lm")
%:pragma GCC optimize("-fipa-sra")
%:pragma GCC optimize("-ftree-pre")
%:pragma GCC optimize("-ftree-vrp")
%:pragma GCC optimize("-fpeephole2")
%:pragma GCC optimize("-ffast-math")
%:pragma GCC optimize("-fsched-spec")
%:pragma GCC optimize("unroll-loops")
%:pragma GCC optimize("-falign-jumps")
%:pragma GCC optimize("-falign-loops")
%:pragma GCC optimize("-falign-labels")
%:pragma GCC optimize("-fdevirtualize")
%:pragma GCC optimize("-fcaller-saves")
%:pragma GCC optimize("-fcrossjumping")
%:pragma GCC optimize("-fthread-jumps")
%:pragma GCC optimize("-funroll-loops")
%:pragma GCC optimize("-fwhole-program")
%:pragma GCC optimize("-freorder-blocks")
%:pragma GCC optimize("-fschedule-insns")
%:pragma GCC optimize("inline-functions")
%:pragma GCC optimize("-ftree-tail-merge")
%:pragma GCC optimize("-fschedule-insns2")
%:pragma GCC optimize("-fstrict-aliasing")
%:pragma GCC optimize("-fstrict-overflow")
%:pragma GCC optimize("-falign-functions")
%:pragma GCC optimize("-fcse-skip-blocks")
%:pragma GCC optimize("-fcse-follow-jumps")
%:pragma GCC optimize("-fsched-interblock")
%:pragma GCC optimize("-fpartial-inlining")
%:pragma GCC optimize("no-stack-protector")
%:pragma GCC optimize("-freorder-functions")
%:pragma GCC optimize("-findirect-inlining")
%:pragma GCC optimize("-fhoist-adjacent-loads")
%:pragma GCC optimize("-frerun-cse-after-loop")
%:pragma GCC optimize("inline-small-functions")
%:pragma GCC optimize("-finline-small-functions")
%:pragma GCC optimize("-ftree-switch-conversion")
%:pragma GCC optimize("-foptimize-sibling-calls")
%:pragma GCC optimize("-fexpensive-optimizations")
%:pragma GCC optimize("-funsafe-loop-optimizations")
%:pragma GCC optimize("inline-functions-called-once")
%:pragma GCC optimize("-fdelete-null-pointer-checks")
#include<cstdio>
#include<cstring>
#include<cctype>
#define BPM (int(1e9)+7)
#define lobit(x) x&-x
#define ll long long
using namespace std;
ll t,n,a[10001],f[301][10001],ans,c[10001];
bool flag=true;
int read() {int x=0,f=1; char c=getchar();while(!isdigit(c)) {if(c=='-')f=-f;c=getchar();}while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();return x*f;
}//快读
void print(int x){if (x>9) print(x/10); putchar(x%10+48); return;
}//快输
void change(ll x,ll a)
{while(x<=n){(c[x]+=a)%=BPM;x+=lobit(x);}
}
ll ask(ll x)
{ll sum=0;while(x){(sum+=c[x])%=BPM;x-=lobit(x);}return sum;
}
int main()
{scanf("%lld",&t);for(ll ti=1;ti<=t;ti++){flag=true;memset(f,0,sizeof(f));n=read();for(ll i=1;i<=n;i++)a[i]=read();for(ll i=1;i<=n;i++)f[1][i]=1;print(n);putchar(' ');for(ll l=2;l<=n;l++){memset(c,0,sizeof(c));ans=0;if(flag)//是否有更长的for(ll i=1;i<=n;i++){f[l][i]=ask(a[i]-1);change(a[i],f[l-1][i]);(ans+=f[l][i])%=BPM;}//动态转移print(ans);if(!ans) flag=0;//没有更长的if(l!=n) putchar(' ');}putchar('\n');}
}

nssl1187-排列【dp,随机卡常,树状数组】相关推荐

  1. HDU 2836 Traversal 简单DP + 树状数组

    题意:给你一个序列,问相邻两数高度差绝对值小于等于H的子序列有多少个. dp[i]表示以i为结尾的子序列有多少,易知状态转移方程为:dp[i] = sum( dp[j] ) + 1;( abs( he ...

  2. Tyler and Strings(树状数组/排列组合/dp)

    题目 题意:给定两个数组s,ts,ts,t,现重排列数组sss,使得数组sss小于ttt.问有多少种排列方式. 参考 代码源自cwxzh #include<bits/stdc++.h> u ...

  3. [POI2011]MET-Meteors 整体二分_树状数组_卡常

    线段树肯定会 TLE 的,必须要用树状数组. Code: // luogu-judger-enable-o2 #include <cstdio> #include <algorith ...

  4. dp 树状数组 逆序元组

    wmq的队伍 发布时间: 2017年4月9日 17:06   最后更新: 2017年4月9日 17:07   时间限制: 2000ms   内存限制: 512M 描述 交大上课需要打卡,于是在上课前的 ...

  5. Codeforces 1096F(dp + 树状数组)

    题目链接 题意: 对于长度为$n$的排列,在已知一些位的前提下求逆序对的期望 思路: 将答案分为$3$部分 $1.$$-1$与$-1$之间对答案的贡献.由于逆序对考虑的是数字之间的大小关系,故假设$- ...

  6. 51nod 1680区间求和 (dp+树状数组/线段树)

    不妨考虑已知一个区间[l,r]的k=1.k=2....k=r-l+1这些数的答案ans(只是这一个区间,不包含子区间) 那么如果加入一个新的数字a[i](i = r+1) 则新区间[l, i]的答案为 ...

  7. 2023牛客寒假算法基础集训营4_20230130「向上取整」「夹逼dp」「lowbit科学+树状数组性质」「搜索」「倍增跳表」「莫队」

    6/13 教育场是有被教育到.(预计会鸽几题. 已过非太水的题们 //B //https://ac.nowcoder.com/acm/contest/46812/B//小构造小数学#include & ...

  8. 暑假集训总结——区间DP,堆的概念及应用,STL(vector、set、pair、map、priority_queue),hash表,树状数组,图论

    序言: 经过长达十几天的集训,确实学了不少知识点.我想如果再不总结的话,6天之后又要忘完了. 所以发一篇具有总结回忆性的博客,供大家回忆. 目录会本人自己排列的时间的先后顺序来排列,可直接食用. 目录 ...

  9. Codeforces 629D Babaei and Birthday Cake(树状数组优化dp)

    题意: 线段树做法 分析: 因为每次都是在当前位置的前缀区间查询最大值,所以可以直接用树状数组优化.比线段树快了12ms~ 代码: #include<cstdio> #include< ...

最新文章

  1. 李开复写给中国学生的七封信之给中国学生的第七封信——21世纪最需要的7种人才续1...
  2. ajax jinja,在Flask中根据ajax response呈现Jinja模板
  3. Oracle中ascii为0的陷阱
  4. 基姆拉尔森星期计算公式
  5. python编写一个弹球游戏_Python实战案例:用Python写一个弹球游戏,就是这么强
  6. [转载] 5.2 calendar--通用日期的相关函数(4)
  7. 安装音量控制程序 WINDOWS
  8. java单精度实型变量_C语言中,用关键字( )定义单精度实型变量,用关键字( )定义双精度实型变量。...
  9. 区块链能够防伪?你彷佛有什么误解!
  10. Selenium本地打开远程浏览器
  11. java计算机毕业设计工作流流程编辑OA系统MyBatis+系统+LW文档+源码+调试部署
  12. WINDOWS操作系统发展历程
  13. c++中怎么求二维数组的长度
  14. 知道这些,让你在使用Prism 8 时更加得心应手!
  15. JSP九大内置对象 .
  16. Cesium中自定义材质material
  17. OneNote桌面版与UWP版避免自动切换字体的方案
  18. 关于lua中显示绝对时间和相对时间
  19. opacity和rgba()的区别
  20. bak文件转oracle文件,如何在Oracle 11g中恢复.bak文件(How to restore .bak file in oracle 11g)...

热门文章

  1. 判断小数是否相等_五年级上册数学综合练习题(填空、判断、选择、文字题),覆盖全册知识点!...
  2. windows传真和扫描由于不能访问您的文档_扫描识别工具Dynamic Web TWAIN全年最低价来了!错过再等一年...
  3. 算法题目——生成括号匹配
  4. 『软件工程3』你应该知道的三种原型实现模型:抛弃式、演化式、增量式
  5. [Java基础]反射获取构造方法并使用
  6. 高等数学下-赵立军-北京大学出版社-题解-练习8.5
  7. 高等数学上-赵立军-北京大学出版社-题解-练习2.6
  8. Calendar Game POJ - 1082(关于日历的博弈问题)
  9. linux加大ram 内核需要,Linux 5.1内核发布:io_uring接口+支持持久性内存用作RAM
  10. mysql递归查询 缓存_MySQL-递归查询方法解析