51nod1376 最长递增子序列的数量
O(n2)显然超时。网上找的题解都是用奇怪的姿势写看不懂TAT。然后自己YY。要求a[i]之前最大的是多少且最大的有多少个。那么线段树维护两个值,一个是当前区间的最大值一个是当前区间最大值的数量那么我们可以做到O(logn)查询最大值和更新。
不过树状数组一直不怎么会用。。。
#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
using namespace std;
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define clr(x,c) memset(x,c,sizeof(x))
#define lson l,mid,x<<1
#define rson mid+1,r,x<<1|1
int read(){
int x=0;char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) x=x*10+c-'0',c=getchar();
return x;
}
const int nmax=5e4+5;
const int inf=0x7f7f7f7f;
const int mod=1e9+7;
int a[nmax],b[nmax],mx[nmax<<2],sm[nmax<<2];
int qmax(int tl,int tr,int l,int r,int x){
if(tl<=l&&tr>=r) return mx[x];
int mid=(l+r)>>1,ans=0;
if(tl<=mid) ans=max(ans,qmax(tl,tr,lson));
if(tr>mid) ans=max(ans,qmax(tl,tr,rson));
return ans;
}
int query(int tl,int tr,int p,int l,int r,int x){
if(tl<=l&&tr>=r) return mx[x]==p?sm[x]:0;
int mid=(l+r)>>1,ans=0;
if(tl<=mid) ans+=query(tl,tr,p,lson);
if(tr>mid) ans+=query(tl,tr,p,rson);
return ans>=mod?ans-mod:ans;
}
void update(int p,int a,int b,int l,int r,int x){
if(mx[x]<a) mx[x]=a,sm[x]=b;
else if(mx[x]==a) sm[x]=(sm[x]+b)%mod;
if(l==r) return ;
int mid=(l+r)>>1;
p<=mid?update(p,a,b,lson):update(p,a,b,rson);
}
void print(int l,int r,int x){
printf("%d %d:%d %d\n",l,r,mx[x],sm[x]);
if(l==r) return ;
int mid=(l+r)>>1;
print(lson);print(rson);
}
int main(){
int n=read();rep(i,1,n) a[i]=b[i]=read();
sort(b+1,b+n+1);int cnt=unique(b+1,b+n+1)-b-1;
rep(i,1,n) a[i]=lower_bound(b+1,b+cnt+1,a[i])-b;
int u,v,d;
rep(i,1,n){
u=a[i]==1?1:qmax(1,a[i]-1,1,cnt,1)+1;
v=u==1?1:query(1,a[i]-1,u-1,1,cnt,1);
update(a[i],u,v,1,cnt,1);
/*printf("->%d %d\n",u,v);
printf("->_->\n");print(1,cnt,1);*/
}
printf("%d\n",sm[1]);
return 0;
}


第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
51nod1376 最长递增子序列的数量的更多相关文章
- 【51nod】1376 最长递增子序列的数量
数组A包含N个整数(可能包含相同的值).设S为A的子序列且S中的元素是递增的,则S为A的递增子序列.如果S的长度是所有递增子序列中最长的,则称S为A的最长递增子序列(LIS).A的LIS可能有很多个. ...
- 51NOD 1376 最长递增子序列的数量 [CDQ分治]
1376 最长递增子序列的数量 首先可以用线段树优化$DP$做,转移时取$0...a[i]$的最大$f$值 但我要练习$CDQ$ $LIS$是二维偏序问题,偏序关系是$i<j,\ a_i< ...
- 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 最长递增子序列的数量 (DP+BIT)
题意:略. 析:dp[i] 表示以第 i 个数结尾的LIS的长度和数量,状态方程很好转移,先说长度 dp[i] = max { dp[j] + 1 | a[i] > a[j] && ...
- 673. Number of Longest Increasing Subsequence最长递增子序列的数量
[抄题]: Given an unsorted array of integers, find the number of longest increasing subsequence. Exampl ...
- 51nod1376 最长上升子序列的数量
机房的人问我树状数组怎么做这题...... 树状数组维护$len, num$表示$LIS$的长度和数量即可 复杂度$O(n \log n)$ 注:$O(n \log n)$二分+单调栈才是真神仙 具体 ...
- 51nod 1376 最长递增子序列的数量(不是dp哦,线段树 + 思维)
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1376 题解:显然这题暴力的方法很容易想到就是以每个数为结尾最 ...
- 【动态规划】拦截导弹_dilworth定理_最长递增子序列
问题 K: [动态规划]拦截导弹 时间限制: 1 Sec 内存限制: 256 MB提交: 39 解决: 10[提交][状态][讨论版] 题目描述 张琪曼:“老师,修罗场是什么?” 墨老师:“修罗是 ...
随机推荐
- vs2010创建并使用DLL
一.为什么需要dll 代码复用是提高软件开发 效率的重要途径.一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用.比较常见的例子是各种应用程序框架, 如ATL ...
- Linux下ettercap的安装,make安装软件步骤
第一步:下载ettercap的压缩包 用tar 解压压缩包,-z 用gzip的方式解压 -x 解打包/解压缩 -f 指定包 -v显示进度 ls 可以查看解压后出现一个新目录 ettercap-0.8 ...
- Google Chrome 浏览器禁用缓存
在使用 Google Chrome 浏览器调试 js 时,会发现修改完 js 不会立即生效,这是由于 chrome 浏览器缓存的原因,而在火狐下没有这个问题.经常使用 chrome 浏览器调试 js ...
- ASP.NET 将Excel导入数据库
将Excel导入数据库大致流程: Excel数据->DataSet->数据库 需要做的准备:1.FileUpload控件一个,按钮一个,如果需要即时显示那么GridView或DataGr ...
- ZOJ3720 Magnet Darts(点在多边形内)
第一道点在多边形内的判断题,一开始以为是凸的.其实题意很简单的啦,最后转化为判断一个点是否在一个多边形内. 如果只是简单的凸多边形的话,我们可以枚举每条边算下叉积就可以知道某个点是不是在范围内了.但对 ...
- iOS-JS交互 (WebViewJavascriptBridge)
, , , ); messageButton.titleLabel.font = font; messageButton.backgroundColor = [UIColor colo ...
- HashMap的key装换成List
Map<String,Object> map = new HashMap<String,Object>(); map.put("a","32332 ...
- Lines演示程序
#include "stdafx.h"#include "d3d9.h"#include "d3dx9.h" #pragma comment ...
- AngularJS学习笔记1——什么是AngularJS?
Angular JS是一个由Google维护的开源的Javascript框架,主要作者为: Misko Hevery(angular JS之父, Sr. Computer Scientist at G ...
- Spring学习总结(1)——Spring AOP的概念理解
1.我所知道的aop 初看aop,上来就是一大堆术语,而且还有个拉风的名字,面向切面编程,都说是OOP的一种有益补充等等.一下子让你不知所措,心想着:怪不得 很多人都和我说aop多难多难 .当我看进去 ...