最长上升子序列O(nlogn) 要强的T^T(2358)
题目来源:http://www.fjutacm.com/Problem.jsp?pid=2358
要强的T^T
TimeLimit:1000MS MemoryLimit:65536K
64-bit integer IO format:%lld
Problem Description
T^T看到Home_W出了一道这么简短的数学题,觉得自己肯定也能出一道。于是便有了这题:
给定n个数,只包含1和2,问最少修改几个数,能使得n个数有序(单调不减)
Input
第一行包含一个数n,表示有n个数,接下来的n行是n个数。(1<=n<=30000)
Output
输出一行,包含最少修改次数
SampleInput
7
2 1 1 1 2 2 1
SampleOutput
2
思路:很明显的最长不下降子序列,但是这题要用到最长上升子序列的O(nlogn)优化方法,该优化方法是用一个数组保存长度为i的最长上升子序列的最小元素,比如对 a[N]={1, 2, 3, 0, 1}进行一边更新len_min数组,i=0, len_min[1]=1; i=1, len_min[2]=2; i=2, len_min[3]=3; i=3, len_min[1]=0, len_min[2]=1。也就是说len_min保存的是到目前循环到的位置为止所有长度为i的子序列里第i位的最小值,就像len_min[1]在i=0(a[0]=1)时为1,但是到了i=3(a[3]=0)时就变成了0,因为长度为1的子序列目前最小的结尾数字已经变成了0。那么这个数组就可以用来二分查找一个数之前最长的子序列。设上界是目前为止的最长上升子序列长度,下界是1如果中间位置保存的值小于目前这个数,那么我们就可以认为这个数前面的最长上升子序列至少不小于那个中间位置的值。
#include<stdio.h>
#include<string.h>
const int N=;
int Max(int a, int b) { return a>b?a:b; }
int Min(int a, int b) { return a<b?a:b; }
int a[N], dp[N], lmin[N], cmp;
int main( ){
int n, ans=;
memset(lmin, 0x3f, sizeof(lmin));
cmp=lmin[];
scanf("%d", &n);
for(int i=; i<n; i++)
scanf("%d", a+i), dp[i]=;
lmin[]=a[];
for(int i=; i<n; ++i){
int l=, r=ans+;
while(l+<r){
int mid=(l+r)/;
if(lmin[mid]>a[i]) r=mid;
else l=mid;
}
if(lmin[l]<=a[i]){
lmin[l+]=Min(lmin[l+], a[i]);
ans=Max(ans, l+);
}
if(!l){
lmin[]=Min(lmin[], a[i]);
}
}
printf("%d\n", n-ans);
return ;
}
拙略的代码
最长上升子序列O(nlogn) 要强的T^T(2358)的更多相关文章
- 最长递减子序列(nlogn)(个人模版)
最长递减子序列(nlogn): int find(int n,int key) { ; int right=n; while(left<=right) { ; if(res[mid]>ke ...
- 洛谷1439:最长公共子序列(nlogn做法)
洛谷1439:最长公共子序列(nlogn做法) 题目描述: 给定两个序列求最长公共子序列. 这两个序列一定是\(1\)~\(n\)的全排列. 数据范围: \(1\leq n\leq 10^5\) 思路 ...
- (转载)最长递增子序列 O(NlogN)算法
原博文:传送门 最长递增子序列(Longest Increasing Subsequence) 下面我们简记为 LIS. 定义d[k]:长度为k的上升子序列的最末元素,若有多个长度为k的上升子序列,则 ...
- 最长递增子序列 O(NlogN)算法
转自:点击打开链接 最长递增子序列,Longest Increasing Subsequence 下面我们简记为 LIS. 排序+LCS算法 以及 DP算法就忽略了,这两个太容易理解了. 假设存在一个 ...
- 满足要求的最长上升子序列(nlogn)
题意:数列A1,A2,...,AN,修改最少的数字,使得数列严格单调递增.(1<=N<=10^5; 1<=Ai<=10^9 ) 思路:首先要明白的一点是数列是严格单调递增,那么 ...
- 最长上升子序列O(nlogn)算法详解
最长上升子序列 时间限制: 10 Sec 内存限制:128 MB 题目描述 给定一个序列,初始为空.现在我们将1到N的数字插入到序列中,每次将一个数字插入到一个特定的位置.我们想知道此时最长上升子 ...
- P3402 最长公共子序列(nlogn)
P3402 最长公共子序列 题目背景 DJL为了避免成为一只咸鱼,来找Johann学习怎么求最长公共子序列. 题目描述 经过长时间的摸索和练习,DJL终于学会了怎么求LCS.Johann感觉DJL孺子 ...
- 最长上升子序列 O(nlogn)
题意:求一个序列中的最长上升子序列. 平常我用的是N*N做法,但是一遇到需要nlogn时,就被卡的无地自容了. 所以下定决心要学习nlogn做法. 如何实现nlongn哪? 这里要用到一个栈B,记录按 ...
- hdu 5773 最长递增子序列 (nlogn)+贪心
The All-purpose Zero Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Oth ...
随机推荐
- python自动化之正则
import re phoneNumRegex=re.compile(r'\d\d\d-\d\d\d-\d\d\d\d') mo=phoneNumRegex.search('My number is ...
- CyclicBarrier用法
CyclicBarrier和CountDownLatch一样,都是关于线程的计数器. 用法略有不同,测试代码如下: 1 public class TestCyclicBarrier { 2 3 pri ...
- 转:机器学习中的算法(2)-支持向量机(SVM)基础
机器学习中的算法(2)-支持向量机(SVM)基础 转:http://www.cnblogs.com/LeftNotEasy/archive/2011/05/02/basic-of-svm.html 版 ...
- UIScrollView浏览一组图片,且图片与图片之间有间隔
---恢复内容开始--- UIScrollView是可以浏览一组view的,只要将其属性 pagingEnabled设置为true就可以了.具体过程是这样的, 1:将一组图片按照从左到右的顺序添加到U ...
- Mybatis笔记八:MyBatis中#{}和${}的区别
先给大家介绍下MyBatis中#{}和${}的区别,具体介绍如下: 1. $将传入的数据直接显示生成在sql中 2. #方式能够很大程度防止sql注入. 3.$方式无法防止Sql注入. 4.$方式一般 ...
- Spring MVC使用Cors实现跨域
在开发APP过程中,APP调用后端接口有跨域的问题,只要在spring-mvc.xml 文件中加入下面的配置即可: <!-- 解决API接口跨域问题配置 Spring MVC 版本必须是 4.2 ...
- RabbitMQ 中 Connection 和 Channel 详解
我们知道无论是生产者还是消费者,都需要和 RabbitMQ Broker 建立连接,这个连接就是一条 TCP 连接,也就是 Connection. 一旦 TCP 连接建立起来,客户端紧接着可以创建一个 ...
- R语言计算moran‘I
R语言计算moran‘I install.packages("maptools")#画地图的包 install.packages("spdep")#空间统计,m ...
- ElasticStack系列之七 & IK自动热更新原理与实现
一.热更新原理 elasticsearch开启加载外部词典功功能后,会每60s间隔进行刷新字典.具体原理代码如下所示: public void loadDic(HttpServletRequest r ...
- nova-api中ExtensionManager的构造
源码版本:H版 nova/api/openstack/__init__.py APIRouter类: def __init__(self, ext_mgr=None, init_only=None): ...