【51nod】1376 最长递增子序列的数量
第1行:1个数N,表示数组的长度。(1 <= N <= 50000)
第2 - N + 1行:每行1个数A[i],表示数组的元素(0 <= A[i] <= 10^9)
输出最长递增子序列的数量Mod 1000000007。
5
1
3
2
0
4
2 题解:nlogn树状数组维护,维护树状数组管辖区域内的最大值 c[i], 及该最大值相对应的最长上升子序列数量 dp[i].
#include<bits/stdc++.h>
using namespace std;
const int N = 5e4+, mod = ;
int a[N], b[N], c[N], dp[N];
void update(int n, int x, int y){
for(int i = n; i < N; i += i&-i){
if(c[i] < x)
c[i] = x, dp[i] = y;
else if(c[i] == x){
dp[i] += y;
if(dp[i] >= mod) dp[i] %= mod;
}
}
}
void get(int n, int& x, int& y){
x = y = ;
for(int i = n; i; i -= i&-i){
if(x < c[i])
x = c[i], y = dp[i];
else if(x == c[i]){
y += dp[i];
if(y >= mod) y %= mod;
}
}
} int main(){
int n; scanf("%d", &n);
for(int i = ; i < n; i++)
scanf("%d", a+i), b[i] = a[i];
sort(b, b+n);
for(int i = ; i < n; i++)
a[i] = lower_bound(b, b+n, a[i])-b+;
int x, y, ans = ;
for(int i = ; i < n; i++){
get(a[i]-, x, y);
x++;
update(a[i], x, x == ? : y);
}
get(n, x, ans);
printf("%d\n", ans);
return ;
}
【51nod】1376 最长递增子序列的数量的更多相关文章
- 51nod 1376 最长递增子序列的数量(线段树)
51nod 1376 最长递增子序列的数量 数组A包含N个整数(可能包含相同的值).设S为A的子序列且S中的元素是递增的,则S为A的递增子序列.如果S的长度是所有递增子序列中最长的,则称S为A的最长递 ...
- 51Nod 1376 最长递增子序列的数量 —— LIS、线段树
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1376 1376 最长递增子序列的数量 基准时间限制:1 秒 空 ...
- 51NOD 1376 最长递增子序列的数量 [CDQ分治]
1376 最长递增子序列的数量 首先可以用线段树优化$DP$做,转移时取$0...a[i]$的最大$f$值 但我要练习$CDQ$ $LIS$是二维偏序问题,偏序关系是$i<j,\ a_i< ...
- 51nod 1376 最长递增子序列的数量(不是dp哦,线段树 + 思维)
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1376 题解:显然这题暴力的方法很容易想到就是以每个数为结尾最 ...
- 51Nod 1376 最长递增子序列的数量 (DP+BIT)
题意:略. 析:dp[i] 表示以第 i 个数结尾的LIS的长度和数量,状态方程很好转移,先说长度 dp[i] = max { dp[j] + 1 | a[i] > a[j] && ...
- 51nod 1376 最长上升子序列的数量 | DP | vector怒刷存在感!
51nod 1376 最长上升子序列的数量 题解 我们设lis[i]为以位置i结尾的最长上升子序列长度,dp[i]为以位置i结尾的最长上升子序列数量. 显然,dp[i]要从前面的一些位置(设为位置j) ...
- 51nod1376 最长递增子序列的数量
O(n2)显然超时.网上找的题解都是用奇怪的姿势写看不懂TAT.然后自己YY.要求a[i]之前最大的是多少且最大的有多少个.那么线段树维护两个值,一个是当前区间的最大值一个是当前区间最大值的数量那么我 ...
- 51nod 1134 最长递增子序列
题目链接:51nod 1134 最长递增子序列 #include<cstdio> #include<cstring> #include<algorithm> usi ...
- 51nod 1218 最长递增子序列 | 思维题
51nod 1218 最长递增子序列 题面 给出一个序列,求哪些元素可能在某条最长上升子序列中,哪些元素一定在所有最长上升子序列中. 题解 YJY大嫂教导我们,如果以一个元素结尾的LIS长度 + 以它 ...
随机推荐
- C#:DataTable内容转换为String(XML)
//DataTable转String方法 public static String DataTable2String(DataTable dt) { string strXML = "< ...
- ecshop添加商品选择品牌时如何按拼音排序
ECSHOP后台添加新商品时,有一个选择品牌的下拉框,如果品牌太多,在下拉框里查找起来很不方便. 我想给“下拉框里的品牌列表”按品牌名的拼音排序,比如有“中国水利出版社” “中国人民出版社” 这两个品 ...
- SQL中join的用法
关于sql语句中的连接(join)关键字,是较为常用而又不太容易理解的关键字,下面这个例子给出了一个简单的解释 --建表table1,table2:create table table1(id int ...
- 64位系统安装ODBC驱动的方法
为了更充分的利用硬件资源,我想很多人都开使用64位操作系统了,同时你可以也发现了在64位操作系统上ODBC的驱动找不到了,所以ODBC的东西都没法用了. 因为2007以前版本的Office只有32位版 ...
- YTU 3002: 出栈顺序(栈和队列)
3002: 出栈顺序(栈和队列) 时间限制: 1 Sec 内存限制: 128 MB 提交: 80 解决: 20 题目描述 给出一个入栈序列,和一个出栈序列,判断该出栈序列是否正确. 输入 输入包含 ...
- 如何在html添加一个搜索框和一个按钮?
<INPUT TYPE="text" id="k"><INPUT TYPE="button" VALUE="ok ...
- FZU 2105 Digits Count(线段树)
Problem 2105 Digits Count Accept: 302 Submit: 1477 Time Limit: 10000 mSec Memory Limit : 262144 KB P ...
- UVa(11292),贪心水题
蓝书P1, 很简单的一个贪心选择,用能力小的去砍小的.本来想双重循环,哎,傻逼了,直接遍历选手,碰到能砍的就砍掉. #include <stdio.h> #include <algo ...
- 2016年12月8日 星期四 --出埃及记 Exodus 21:3
2016年12月8日 星期四 --出埃及记 Exodus 21:3 If he comes alone, he is to go free alone; but if he has a wife wh ...
- codevs1137 计算系数
1137 计算系数 2011年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 给定一 ...