最长上升子序列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 ...
随机推荐
- win xp安装
Windows XP with sp3 VOL 微软原版下载: zh-hans_windows_xp_professional_with_service_pack_3_x86_cd_vl_x14-74 ...
- MySQL复合主键下ON DUPLICATE KEY UPDATE语句失效问题
问题的起因,假设有一张表,里面保存了交易订单,每张订单有唯一的ID,有最后更新时间,还有数据,详情如下: 1 2 3 4 5 6 7 +-------+----------+------+-----+ ...
- SPOJ_VLATTICE
题目是给你一个空间,和一个点(n,n,n),求从原点出发能够直接接触多少个点(不经过任何一个点)? 典型的mobius反演即可. 首先,ans=3,因为(1,0,0),(0,1,0),(0,0,1)这 ...
- Qt 删除目录
删除目标的目录,若该目录下有子目录,一并删除. //判断是否存在子目录 bool judgeDir(QDir dir) { dir.setFilter(QDir::AllEntries | QDir: ...
- plsql 只有三个文本框,无法登陆
plsql版本与oracle版本不一致,如 你装的是oracle 64位,但是plsql装的是32位,就会出问题了,解决方案就是下载个64位plsql
- 【题解】HDU4336 Card Collector
显然,这题有一种很简单的做法即直接状压卡牌的状态并转移期望的次数.但我们现在有一个更加强大的工具——min-max容斥. min-max 容斥(对期望也成立):\(E[max(S)] = \sum_{ ...
- C函数调用机制及栈帧指针
http://blog.csdn.net/jjiss318/article/details/7185802
- 构建工具-----Gradle(二)-----myeclipse 10和myeclipse2015安装gradle插件----其他版本的myeclipse类似
我们需要给myeclipse安装gradle的插件.这样myeclipse就能识别到gradle项目了,直接加载进去即可. 我们先安装配置系统命令行的gradle,挺简单的,下载后配置环境变量即可,详 ...
- 线性判别分析 LDA
点到判决面的距离 点\(x_0\)到决策面\(g(x)= w^Tx+w_0\)的距离:\(r={g(x)\over \|w\|}\) 广义线性判别函数 因任何非线性函数都可以通过级数展开转化为多项式函 ...
- 闲:测试memcpy和std::copy vector之间拷贝
预测:底层C函数肯定比stl算法快 结果:少量数据底层快,大数据以上则stl对vector的处理可能更好 C/C++: #include <iostream> #include <v ...