Longest Increasing Subsequence HDU - 6284
- /*
- 首先预处理好f g数组
- fi :以a[i]为结尾的 最长上升子序列的长度
- gi :以a[i]为开始的 最长上升子序列的长度
- mxx : 最长上升子序列的长度
- 线段树优化 nlogn
- (不包含a[i]==0)
- 显然把所有0换成x 只可能是mxx变成mxx+1
- 然后我们考虑一对 i j (下标)
- 若 f[i]+g[j]==mxx 则 所有a[i]+1~~~a[j]-1之间的x
- 他们对用的lis长度为mxx+1
- 然后枚举i j凉了
- 对于一个i 我们只需要找到 他后面的 一个j 满足 f[i]+g[j]==mxx 并且a[j]最大
- 然后维护bg[i] 表示长度为g[j]==i的所有的 a[j]中最大的
- 从后往前枚举i 然后维护 bg O(1)转移
- 上述过程可能 i和bg维护的j之间 他没有0 那就不能转移
- 所以 按0分段 遇到0 就把之前的信息更新bg
- 然后没了
- */
- #include<cstdio>
- #include<iostream>
- #include<cstdlib>
- #define lc k*2
- #define rc k*2+1
- #define mid (l+r)/2
- #define maxn 400010
- #define ll long long
- using namespace std;
- ll n,a[maxn],f[maxn],s[maxn],g[maxn],as[maxn],bg[maxn],c[maxn][];
- void Insert(ll k,ll l,ll r,ll x,ll y){
- if(x==l&&r==x){
- s[k]=max(s[k],y);return;
- }
- if(x<=mid)Insert(lc,l,mid,x,y);
- else Insert(rc,mid+,r,x,y);
- s[k]=max(s[lc],s[rc]);
- }
- ll Query(ll k,ll l,ll r,ll x,ll y){
- if(x>y)return ;
- if(x<=l&&y>=r)return s[k];
- ll res=;
- if(x<=mid)res=max(res,Query(lc,l,mid,x,y));
- if(y>mid)res=max(res,Query(rc,mid+,r,x,y));
- return res;
- }
- int main(){
- while(~scanf("%lld",&n)){
- for(ll i=;i<=n*;i++)
- s[i]=f[i]=g[i]=as[i]=;
- for(ll i=;i<=n;i++){
- scanf("%lld",&a[i]);
- //a[i]=rand();
- f[i]=;g[i]=;
- }
- ll mxx=;
- for(ll i=;i<=n;i++){
- if(a[i]==)continue;
- ll mx=Query(,,n,,a[i]-);
- f[i]=mx+;mxx=max(mxx,f[i]);
- Insert(,,n,a[i],f[i]);
- }
- for(ll i=;i<=n*;i++)s[i]=;
- for(ll i=n;i>=;i--){
- if(a[i]==)continue;
- ll mx=Query(,,n,a[i]+,n);
- g[i]=mx+;Insert(,,n,a[i],g[i]);
- }
- for(ll i=;i<=n*;i++)bg[i]=;
- ll cnt=;a[]=-;
- for(ll i=n;i>=;i--){
- if(a[i]==){
- for(ll j=;j<=cnt;j++)
- bg[c[j][]]=max(bg[c[j][]],c[j][]);
- cnt=;bg[]=n+;
- }
- else{
- ll mx=bg[mxx-f[i]];
- c[++cnt][]=g[i];c[cnt][]=a[i];
- if(mx-<a[i]+)continue;
- as[a[i]+]++;as[mx]--;
- }
- }
- ll ans=;
- for(ll i=;i<=n;i++)as[i]+=as[i-];
- for(ll i=;i<=n;i++){
- if(as[i]>)ans+=i*(mxx+);
- else ans+=i*mxx;
- //("%lld\n",ans);
- }
- printf("%lld\n",ans);
- }
- return ;
- }
Longest Increasing Subsequence HDU - 6284的更多相关文章
- 最长上升子序列 LIS(Longest Increasing Subsequence)
引出: 问题描述:给出一个序列a1,a2,a3,a4,a5,a6,a7….an,求它的一个子序列(设为s1,s2,…sn),使得这个子序列满足这样的性质,s1<s2<s3<…< ...
- [LeetCode] Longest Increasing Subsequence 最长递增子序列
Given an unsorted array of integers, find the length of longest increasing subsequence. For example, ...
- [tem]Longest Increasing Subsequence(LIS)
Longest Increasing Subsequence(LIS) 一个美丽的名字 非常经典的线性结构dp [朴素]:O(n^2) d(i)=max{0,d(j) :j<i&& ...
- [LintCode] Longest Increasing Subsequence 最长递增子序列
Given a sequence of integers, find the longest increasing subsequence (LIS). You code should return ...
- Leetcode 300 Longest Increasing Subsequence
Given an unsorted array of integers, find the length of longest increasing subsequence. For example, ...
- [LeetCode] Longest Increasing Subsequence
Longest Increasing Subsequence Given an unsorted array of integers, find the length of longest incre ...
- The Longest Increasing Subsequence (LIS)
传送门 The task is to find the length of the longest subsequence in a given array of integers such that ...
- 300. Longest Increasing Subsequence
题目: Given an unsorted array of integers, find the length of longest increasing subsequence. For exam ...
- SPOJ LIS2 Another Longest Increasing Subsequence Problem 三维偏序最长链 CDQ分治
Another Longest Increasing Subsequence Problem Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://a ...
随机推荐
- 最容易理解的HMM文章
wiki上一个比较好的HMM例子 分类 隐马尔科夫模型 HMM(隐马尔科夫模型)是自然语言处理中的一个基本模型,用途比较广泛,如汉语分词.词性标注及语音识别等,在NLP中占有很重要的地位.网上关于HM ...
- JAVA 学习笔记 - 基础语法 2
---恢复内容开始--- 1.数组的申明和应用 数据类型 数组名称[] = null; //在堆栈中申明变量名称 数组名称 = new 数据类型[10]; // ...
- Python之字符串的特性及常用方法
字符串的特性 索引: (索引是从0开始) s='hello'print(s[0])print(s[4])print(s[-1]) #拿出最后一个字符 hoo12345678截取s[start:stop ...
- token机制完成登录状态保持/身份认证
一般APP都是刚安装后,第一次启动时需要登录(提示你需要登录或者直接启动在登录界面).而只要登录成功后,以后每次启动时都是登录状态,不需要每次启动时再次登录.不过,也有些APP若你长期未启动,再次启动 ...
- break和continue在多重循环中使用
break和continue在多重循环中使用 关于break和continue在java中,break的作用是跳出循环,continue的作用是跳出本次循环. 我们一般情况下,这样使用: public ...
- Luogu P1991 无线通讯网
P1991 无线通讯网 题目描述 国防部计划用无线网络连接若干个边防哨所.2 种不同的通讯技术用来搭建无线网络: 每个边防哨所都要配备无线电收发器:有一些哨所还可以增配卫星电话. 任意两个配备了一条卫 ...
- 以gnome-terminal为例,修改gnome3 的默认配置
gnome连续几个版本的terminal默认配置文件都是同一个配置文件“b1dcc9dd-5262-4d8d-a863-c897e6d979b9”.这是因为gnome的developers编辑了这个配 ...
- 转载:SpringMVC的工作原理图
SpringMVC的工作原理图: SpringMVC流程 1. 用户发送请求至前端控制器DispatcherServlet. 2. DispatcherServlet收到请求调用HandlerMa ...
- Python,subprocess模块(补充)
1.subprocess模块,前戏 res = os.system('dir') 打印到屏幕,res为0或非0 os.popen('dir') 返回一个内存对象,相当于文件流 a = os.popen ...
- git 忽略文件[.gitignore]常用配置
.idea .buildpath .project .settings .Ds_Store composer.json composer.lock a.php /public/uploads /run ...