nlogn 模板 最长上升

#include<bits/stdc++.h>
using namespace std;
const int N=;
int n,x,y,a[N],num[N],d[N],len;
/*
int binary_search(int i){
int left,right,mid;
left=0,right=len;
while(left<right){
mid = left+(right-left)/2;
if(ans[mid]>=arr[i]) right=mid;
else left=mid+1;
}
return left;
}
*/
int main(){
//LCS转换成LIS
ios::sync_with_stdio(false);
cin>>n;
for(int i=;i<=n;i++)
cin>>x,num[x]=i;
for(int i=;i<=n;i++)
cin>>y,a[i]=num[y]; //nlogn LIS
d[]=a[],len=;
for(int i=;i<=n;i++){
if(a[i]>d[len])
d[++len]=a[i];
else{
//int pos=binary_search(i);
int pos=lower_bound(d,d+len,a[i])-d;
d[pos]=a[i];}
}
printf("%d",len);return ;}

UVa10635,蓝书p66例题27:另一种写法

#include<bits/stdc++.h>

using namespace std;

const int N=;
const int inf=0x3f3f3f3f; int s[N],g[N],d[N],num[N]; int main(){
int t;scanf("%d",&t);
for(int kase=;kase<=t;kase++){
int N,p,q,x;
scanf("%d%d%d",&N,&p,&q);
memset(num,,sizeof num);
for(int i=;i<=p+;i++){
scanf("%d",&x);
num[x]=i;}
int n=;
for(int i=;i<q+;i++){
scanf("%d",&x);
if(num[x]) s[n++]=num[x];} for(int i=;i<=n;i++) g[i]=inf;
int ans=;
for(int i=;i<n;i++){
int k=lower_bound(g+,g++n,s[i])-g;
d[i]=k;
g[k]=s[i];
ans=max(ans,d[i]);
}printf("Case %d: %d\n",kase,ans);
}return ;
}

ATTENTION:最长不下降,需要a[i]>=d[len]以及      UPPER_bound !!!!

nlogn LIS模板的更多相关文章

  1. 【nlogn LIS】 模板

    总结:stl真好用 #include <cstdio> #include <cstring> #include <iostream> #include <al ...

  2. 【模板】LIS模板 洛谷P1091 [NOIP2004提高组]合唱队形 [2017年4月计划 动态规划11]

    以题写模板. 写了两个:n^2版本与nlogn版本 P1091 合唱队形 题目描述 N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形. 合唱队形是指这样的一种队 ...

  3. O(nlogn)LIS及LCS算法

    morestep学长出题,考验我们,第二题裸题但是数据范围令人无奈,考试失利之后,刻意去学习了下优化的算法 一.O(nlogn)的LIS(最长上升子序列) 设当前已经求出的最长上升子序列长度为len. ...

  4. 最长上升子序列(LIS)模板

    最长递增(上升)子序列问题:在一列数中寻找一些数,这些数满足:任意两个数a[i]和a[j],若i<j,必有a[i]<a[j],这样最长的子序列称为最长递增(上升)子序列. 考虑两个数a[x ...

  5. 求最长上升子序列(Lis模板)

    实现过程 定义已知序列数组为dp[]:dp[1…8]=389,207,155,300,299,170,158,65 我们定义一个序列B,然后令 i = 1 to 8 逐个考察这个序列.此外,我们用一个 ...

  6. 二分LIS模板

    假设存在一个序列d[1..9] = 2 1 5 3 6 4 8 9 7,可以看出来它的LIS长度为5. 下面一步一步试着找出它. 我们定义一个序列B,然后令 i = 1 to 9 逐个考察这个序列. ...

  7. 动态规划-最长上升子序列(LIS模板)多解+变形

    问题描述 一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的.对于给定的一个序列(a1, a2, ..., aN),我们可以得到一些上升的子序列( ...

  8. poj 3903 poj 2533 (LIS模板题)

    pi1 < pi2 < ... < pik, with i1 < i2 < ... < ik. Sample Input 6 5 2 1 4 5 3 3 1 1 1 ...

  9. POJ1631 LIS模板

    题目:http://poj.org/problem?id=1631 两种nlogn的方法. 1.树状数组优化暴力.有种扫描线的感觉,以时间保证位置,把值作为数组脚标. 2.记录长为...的上升子序列末 ...

随机推荐

  1. React 支持JS

    <!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8" ...

  2. Java关于struts2框架

    今天研究了一下struts2框架,我不太喜欢理论的东西,我研究框架更喜欢打断点一步步跟着去看实现的过程.

  3. POJ3258-River Hopscotch-二分答案

    一条河里有一串石头,给出石头间的间距,让你去掉m个石头,使最短间距最大. 二分答案,对于每一种mid,判断要不要删除这块石头.然后逼近答案. #include <cstdio> #incl ...

  4. MySQL 5.7双主同步部分表

    参考:http://www.jb51.net/article/122892.htm?pc 前言: 我们要配置双主同步的mysql服务器. 暂时叫做,mysql1和mysql2吧. 一  mysql的配 ...

  5. BZOJ5334 [TJOI2018] 数学计算 【线段树分治】

    题目分析: 大概是考场上的签到题.首先mod不是质数,所以不能求逆元.注意到有加入操作和删除操作.一个很典型的想法就是线段树分治.建立时间线段树然后只更改有影响的节点,最后把所有标记下传.时间复杂度是 ...

  6. MessageBox函数第一个参数hwnd的作用

    MessageBox 函数用于创建.显示并操作一个消息对话框.该对话框包含由调用程序定义的信息和标题,以及预先定义的图标和按钮. 这个方法的第一个参数hWnd,代表消息框拥有的窗口.这个参数到底有什么 ...

  7. day9 笔记

    集合 去重 无序 元素不可变类型 可hash 命令 set() 创建可变集合 frozenset() 创建不可变集合 .add() 添加元素,只能放单个值 .update() 添加元素,可以更新多个值 ...

  8. 【题解】 Codeforces Edu44 F.Isomorphic Strings (字符串Hash)

    题面戳我 Solution 我们按照每个字母出现的位置进行\(hash\),比如我们记录\(a\)的位置:我们就可以把位置表示为\(0101000111\)这种形式,然后进行字符串\(hash\) 每 ...

  9. BZOJ2839 : 集合计数 (广义容斥定理)

    题目 一个有 \(N\) 个 元素的集合有 \(2^N\) 个不同子集(包含空集), 现在要在这 \(2^N\) 个集合中取出若干集合(至少一个), 使得它们的交集的元素个数为 \(K\) ,求取法的 ...

  10. Leetcode 237.删除链表中的节点 By Python

    请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点. 现有一个链表 -- head = [4,5,1,9],它可以表示为: 4 -> 5 -> 1 - ...