最长上升子序列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 ...
随机推荐
- testdisk修复文件系统
故障修复步骤: 1. 检查磁盘分区级文件系统确实不在: 2. 云主机内部下载testdisk工具修复 yum install testdisk -y 3. 执行命令testdisk /dev/vdc进 ...
- linux下tomcat、jenkins环境搭建
1.安装JDK 我不列出来了,自行百度 java -version 2.安装tomcat (1)将下载的tomcat压缩包 tar -zxvf apache-tomcat-8.5.29.tar.gz ...
- FileZilla Server ftp 服务器下通过alias别名设置虚拟目录(多个分区)
最近检查服务器的时候发现磁盘空间不够用了,正好有两个硬盘正好,一个硬盘还空着,正好通过ftp服务器的别名功能实现添加空间了,这样就不用重新弄机器了 说明:FileZilla Server 的虚拟目录设 ...
- NOIP2017 游记
没考多好......并不知道该写什么...... 那就写写流水账...... DAY 0 上午到机房,众人全是打板子or颓废的....然后我打完板子去打印了个奇怪的背包九讲.... 然后大巴到德州东, ...
- Luogu 2801 教主的魔法 | 分块模板题
Luogu 2801 教主的魔法 | 分块模板题 我犯的错误: 有一处l打成了1,还看不出来-- 缩小块大小De完bug后忘了把块大小改回去就提交--还以为自己一定能A了-- #include < ...
- BZOJ3550 [ONTAK2010]Vacation 【单纯形】
题目链接 BZOJ3550 题解 单纯形裸题 题意不清,每个位置最多选一次 #include<algorithm> #include<iostream> #include< ...
- [Android Studio] *.jar 与 *.aar 的生成与*.aar导入项目方法(转)
[Android][Android Studio] *.jar 与 *.aar 的生成与*.aar导入项目方法http://blog.csdn.net/qiujuer/article/details/ ...
- 得到不知道维度的string数组的维度
在项目中常用到一类数组,那就是不知道个数的数组,例如: string ParamTable[] = {"frequency","ifbw","span ...
- Java入门:使用Java API
什么是Java类库 在编写程序的时候,通常有很多功能是通用的,或者是很基础的,可以用这些功能来组成更发杂的功能代码.比如文件操作,不同程序对文件的操作基本都是一样的,打开文件,关闭文件,读取文件里面的 ...
- Redis+Sentinel 实现redis集群高可用
1.sentinel作用及实现原理: https://my.oschina.net/u/172871/blog/596976?p={{currentPage-1}}