hdu5542 The Battle of Chibi【树状数组】【离散化】
The Battle of Chibi
Time Limit: 6000/4000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)
Total Submission(s): 2899 Accepted Submission(s): 1043
So there is only one way left for Yu Zhou, send someone to fake surrender Cao Cao. Gai Huang was selected for this important mission. However, Cao Cao was not easy to believe others, so Gai Huang must leak some important information to Cao Cao before surrendering.
Yu Zhou discussed with Gai Huang and worked out N information to be leaked, in happening order. Each of the information was estimated to has ai value in Cao Cao's opinion.
Actually, if you leak information with strict increasing value could accelerate making Cao Cao believe you. So Gai Huang decided to leak exact M information with strict increasing value in happening order. In other words, Gai Huang will not change the order of the N information and just select M of them. Find out how many ways Gai Huang could do this.
Each test case begins with two numbers N(1≤N≤103) and M(1≤M≤N), indicating the number of information and number of information Gai Huang will select. Then N numbers in a line, the ith number ai(1≤ai≤109) indicates the value in Cao Cao's opinion of the ith information in happening order.
The result is too large, and you need to output the result mod by 1000000007(109+7).
3 2
1 2 3
3 2
3 2 1
Case #2: 0
In the first cases, Gai Huang need to leak 2 information out of 3. He could leak any 2 information as all the information value are in increasing order.
In the second cases, Gai Huang has no choice as selecting any 2 information is not in increasing order.
题意:
问一个序列之中有多少个长度为M的严格递增子序列。
思路:
我们用dp[i][j]表示前j个数中,以Aj为结尾的长度为i的严格递增子序列的个数。
那么对于dp[i][j],我们只需要枚举所有小于j的k,并且Ak < Aj,将所有的dp[i-1][k]求和,可以得到dp[i][j]
很容易想到O(n^3)的算法,但是显然会超时,所以我们需要进行一些优化。
当我们枚举内层循环j,k时,外层循环i就可以被当成是定值。当j增加1,k的取值只是多了k = j这个新的决策。
因此我们用树状数组维护一个前缀和,表示1~j区间,长度为i-1时的方案数。
由于add时第一个参数放的是a[j],也就是说现在直接用了他的权值作为了下标,所以只要下标比他小的,权值一定比他小,也就不需要进行比较了。直接去前缀和就可以了。【日常感谢家庭教师】
最开始离散化用的set和map TLE了
后来改用了另一个数组,先排序然后lower_bound,并且直接把原数组的值改掉
#include <iostream>
#include <set>
#include <cmath>
#include <stdio.h>
#include <cstring>
#include <algorithm>
#include <map>
using namespace std;
typedef long long LL;
#define inf 0x7f7f7f7f int t, n, m, cnt;
const int maxn = ;
const LL mod = 1e9 + ;
int a[maxn], b[maxn];
LL sum[maxn], dp[maxn][maxn];
map<LL, int>discrete;
set<LL>sss;
set<LL>::iterator iter; void add(int pos, LL x)
{
while(pos <= n + ){
sum[pos] = (sum[pos] + x) % mod;
pos += (pos & -pos);
}
} LL ask(int pos)
{
LL ans = ;
while(pos){
ans = (ans + sum[pos]) % mod;;
pos -= (pos & -pos);
}
return ans;
} void init()
{
discrete.clear();
sss.clear();
//memset(dp, 0, sizeof(dp));
for(int i = ; i <= m; i++){
for(int j = ; j <= n; j++){
dp[i][j] = ;
}
}
cnt = ;
} int main()
{
scanf("%d", &t);
for(int cas = ; cas <= t; cas++){
init();
scanf("%d%d", &n, &m);
a[] = b[] = -inf;
dp[][] = ;
//sss.insert(a[0]);
for(int i = ; i <= n; i++){
scanf("%d", &a[i]);
b[i] = a[i];
//sss.insert(a[i]);
}
sort(b, b + n + );
for(int i = ; i <= n; i++){
a[i] = lower_bound(b, b + + n, a[i]) - b + ;
//cout<<a[i]<<endl;
}
/*for(iter = sss.begin(); iter != sss.end(); iter++){
discrete[*iter] = ++cnt;
}*/
//cout<<a[0]<<endl;
for(int i = ; i <= m; i++){
//memset(sum, 0, sizeof(sum));
for(int j = ; j <= n + ; j++){
sum[j] = ;
}
add(a[], dp[i - ][]); for(int j = ; j <= n; j++){
dp[i][j] = ask(a[j] - );
//if(discrete[a[j]] < discrete[a[j + 1]])
add(a[j], dp[i - ][j]);
}
} int ans = ;
for(int i = ; i <= n; i++){
ans = (ans + dp[m][i]) % mod;
}
printf("Case #%d: %d\n", cas, ans);
}
}
hdu5542 The Battle of Chibi【树状数组】【离散化】的更多相关文章
- 南阳ccpc C题 The Battle of Chibi && hdu5542 The Battle of Chibi (树状数组优化+dp)
题意: 给你一个长度为n的数组,你需要从中找一个长度为m的严格上升子序列 问你最多能找到多少个 题解: 我们先对原序列从小到大排序,排序之后的序列就是一个上升序列 这里如果两个数相等的话,那么因为题目 ...
- 南阳ccpc C题 The Battle of Chibi 树状数组+dp
题目: Cao Cao made up a big army and was going to invade the whole South China. Yu Zhou was worried ab ...
- hdu4605 树状数组+离散化+dfs
Magic Ball Game Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- BZOJ_5055_膜法师_树状数组+离散化
BZOJ_5055_膜法师_树状数组+离散化 Description 在经历过1e9次大型战争后的宇宙中现在还剩下n个完美维度, 现在来自多元宇宙的膜法师,想偷取其中的三个维度为伟大的长者续秒, 显然 ...
- POJ 2299 【树状数组 离散化】
题目链接:POJ 2299 Ultra-QuickSort Description In this problem, you have to analyze a particular sorting ...
- HDU 2227 Find the nondecreasing subsequences (DP+树状数组+离散化)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2227 Find the nondecreasing subsequences ...
- BZOJ-1227 虔诚的墓主人 树状数组+离散化+组合数学
1227: [SDOI2009]虔诚的墓主人 Time Limit: 5 Sec Memory Limit: 259 MB Submit: 914 Solved: 431 [Submit][Statu ...
- POJ 2299 树状数组+离散化求逆序对
给出一个序列 相邻的两个数可以进行交换 问最少交换多少次可以让他变成递增序列 每个数都是独一无二的 其实就是问冒泡往后 最多多少次 但是按普通冒泡记录次数一定会超时 冒泡记录次数的本质是每个数的逆序数 ...
- [HDOJ4325]Flowers(树状数组 离散化)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4325 关于离散化的简介:http://blog.csdn.net/gokou_ruri/article ...
- HDU4456-Crowd(坐标旋转+二位树状数组+离散化)
转自:http://blog.csdn.net/sdj222555/article/details/10828607 大意就是给出一个矩阵 初始每个位置上的值都为0 然后有两种操作 一种是更改某个位置 ...
随机推荐
- 【转】MFC 对话框Border属性设置(None、Thin、Resizing、Dialog Frame)
对话框的Border属性对应的值设置 Dialog Frame WS_CAPTION | WS_POPUP | WS_SYSMENU | WS_CLIPSIBLINGS | DS_MODALFRAME ...
- linux -- Apache执行权限
最近在用php调用exec方法去执行一个linux终端下的命令,结果每次都不能执行成功,网上多番搜寻,最终找到一篇有用的文章,主要原因是因为Apache的执行权限的问题.以下是原文(稍加修改): 利用 ...
- linux源代码编译安装OpenCV
为了尽可能保证OpenCV的特性,使用OpenCV源代码编译安装在linux上.先从安装其依赖项開始,以ubuntu 14.04.X为例解说在Linux上源代码编译安装OpenCV,其它linux版本 ...
- CentOS运行级别和开机过程
linux运行级别: 1)0:关机 2)1:单用户 3)2:多用户状态没有网络服务 4)3:多用户状态有网络服务 5)4:系统未使用保留给用户 6)5:图形界面 7)6:系统重启 注:常用运行级别是3 ...
- Unity文件操作路径
Unity3D中的资源路径: Application.dataPath:此属性用于返回程序的数据文件所在文件夹的路径.例如在Editor中就是Assets了. Application.streamin ...
- centos7,yum安装工具报错
1.问题描述:yum安装gcc和其他的工具时一直报错: 2.问题解决: 网上看到有类似文章: No more mirrors to try. 得知这可能是错误的缓存源导致,直接两个命令解决: yum ...
- Python 爬虫知识点 - 淘宝商品检索结果抓包分析
一.抓包基础 在淘宝上搜索“Python机器学习”之后,试图抓取书名.作者.图片.价格.地址.出版社.书店等信息,查看源码发现html-body中没有这些信息,分析脚本发现,数据存储在了g_page_ ...
- NodeJS-001-Nodejs学习文档整理(转-出自http://www.cnblogs.com/xucheng)
Nodejs学习文档整理 http://www.cnblogs.com/xucheng/p/3988835.html 1.nodejs是什么: nodejs是一个是javascript能在后台运行的平 ...
- Python 进阶(一)函数式编程
来自慕课网: 简介: 函数:function ,在入门课程已学 函数式:functional,一种编程范式 函数式编程是一种抽象计算的编程模式,函数≠函数式,好比:计算≠计算机
- 数据库客户端快捷键(oracle+sybase)
PL/SQL: 选中单行:鼠标三连击某行,那么这一行即被选中. 执行脚本:F8