nlogn LIS模板
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模板的更多相关文章
- 【nlogn LIS】 模板
总结:stl真好用 #include <cstdio> #include <cstring> #include <iostream> #include <al ...
- 【模板】LIS模板 洛谷P1091 [NOIP2004提高组]合唱队形 [2017年4月计划 动态规划11]
以题写模板. 写了两个:n^2版本与nlogn版本 P1091 合唱队形 题目描述 N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形. 合唱队形是指这样的一种队 ...
- O(nlogn)LIS及LCS算法
morestep学长出题,考验我们,第二题裸题但是数据范围令人无奈,考试失利之后,刻意去学习了下优化的算法 一.O(nlogn)的LIS(最长上升子序列) 设当前已经求出的最长上升子序列长度为len. ...
- 最长上升子序列(LIS)模板
最长递增(上升)子序列问题:在一列数中寻找一些数,这些数满足:任意两个数a[i]和a[j],若i<j,必有a[i]<a[j],这样最长的子序列称为最长递增(上升)子序列. 考虑两个数a[x ...
- 求最长上升子序列(Lis模板)
实现过程 定义已知序列数组为dp[]:dp[1…8]=389,207,155,300,299,170,158,65 我们定义一个序列B,然后令 i = 1 to 8 逐个考察这个序列.此外,我们用一个 ...
- 二分LIS模板
假设存在一个序列d[1..9] = 2 1 5 3 6 4 8 9 7,可以看出来它的LIS长度为5. 下面一步一步试着找出它. 我们定义一个序列B,然后令 i = 1 to 9 逐个考察这个序列. ...
- 动态规划-最长上升子序列(LIS模板)多解+变形
问题描述 一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的.对于给定的一个序列(a1, a2, ..., aN),我们可以得到一些上升的子序列( ...
- 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 ...
- POJ1631 LIS模板
题目:http://poj.org/problem?id=1631 两种nlogn的方法. 1.树状数组优化暴力.有种扫描线的感觉,以时间保证位置,把值作为数组脚标. 2.记录长为...的上升子序列末 ...
随机推荐
- React 支持JS
<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8" ...
- Java关于struts2框架
今天研究了一下struts2框架,我不太喜欢理论的东西,我研究框架更喜欢打断点一步步跟着去看实现的过程.
- POJ3258-River Hopscotch-二分答案
一条河里有一串石头,给出石头间的间距,让你去掉m个石头,使最短间距最大. 二分答案,对于每一种mid,判断要不要删除这块石头.然后逼近答案. #include <cstdio> #incl ...
- MySQL 5.7双主同步部分表
参考:http://www.jb51.net/article/122892.htm?pc 前言: 我们要配置双主同步的mysql服务器. 暂时叫做,mysql1和mysql2吧. 一 mysql的配 ...
- BZOJ5334 [TJOI2018] 数学计算 【线段树分治】
题目分析: 大概是考场上的签到题.首先mod不是质数,所以不能求逆元.注意到有加入操作和删除操作.一个很典型的想法就是线段树分治.建立时间线段树然后只更改有影响的节点,最后把所有标记下传.时间复杂度是 ...
- MessageBox函数第一个参数hwnd的作用
MessageBox 函数用于创建.显示并操作一个消息对话框.该对话框包含由调用程序定义的信息和标题,以及预先定义的图标和按钮. 这个方法的第一个参数hWnd,代表消息框拥有的窗口.这个参数到底有什么 ...
- day9 笔记
集合 去重 无序 元素不可变类型 可hash 命令 set() 创建可变集合 frozenset() 创建不可变集合 .add() 添加元素,只能放单个值 .update() 添加元素,可以更新多个值 ...
- 【题解】 Codeforces Edu44 F.Isomorphic Strings (字符串Hash)
题面戳我 Solution 我们按照每个字母出现的位置进行\(hash\),比如我们记录\(a\)的位置:我们就可以把位置表示为\(0101000111\)这种形式,然后进行字符串\(hash\) 每 ...
- BZOJ2839 : 集合计数 (广义容斥定理)
题目 一个有 \(N\) 个 元素的集合有 \(2^N\) 个不同子集(包含空集), 现在要在这 \(2^N\) 个集合中取出若干集合(至少一个), 使得它们的交集的元素个数为 \(K\) ,求取法的 ...
- Leetcode 237.删除链表中的节点 By Python
请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点. 现有一个链表 -- head = [4,5,1,9],它可以表示为: 4 -> 5 -> 1 - ...