【题解】合唱队形——LIS坑爹的二分优化
题目
【题目描述】
N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。
合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK,则他们的身高满足T1<...<Ti>Ti+1>…>TK(1<=i<=K)。
你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。
【输入格式】
输入文件chorus.in的第一行是一个整数N,表示同学的总数。第一行有n个整数,用空格分隔,第i个整数Ti是第i位同学的身高(厘米)。
【输出格式】
输出文件chorus.out包括一行,这一行只包含一个整数,就是最少需要几位同学出列。
【样例输入】
8
186 186 150 200 160 130 197 220
【样例输出】
4
【数据规模】
对于50%的数据,保证有n<=200;
对于100%的数据,保证有n<=20000,1<=Ti<=1000000。
解析
该题本身平淡无奇,只是一个标准的LIS动态规划。但是!该题扩大了数据范围!
使得本来O(n2)的时间复杂度过不了,于是只有优化(关键是我考试时没怎么注意)。
这里便会有二分查找的优化方法。
思路
枚举中间的人i,以他为终点正向和倒向求两次LIS,用l[i]和r[i]分别表示以i结尾LIS长度。然后ans = n - l[i] + r[i] + 1;
注意到N <= 20000,所以必须使用logN的算法求LIS
使用d[]临时存储LIS,依次将序列中的数a[i]按以下条件加入d[]中:如果a[i] > d[len](d[len]是d[]中的最后一个数),则d[++len] = a[i],否则在d[]中找第一个比a[i]**大或等(必须取到=,否则相同的数将不被替换,而是替换成了第一个比它大的数** )的数,将其替换,这样做的目的是使d[]更有可能成为一个更长的序列。我们注意到d[]是一个递增的序列,则在完成查找时可使用二分的方法。
注意在这个过程中存储l[i]和r[i]
代码
#include<iostream>
#include<cstring>
using namespace std; int a[],l[],r[],rem[];
int n; int main()
{
freopen("chorus.in","r",stdin);
freopen("chorus.out","w",stdout); cin>>n;
for(int i=;i<=n;i++) cin>>a[i]; int len=;
for(int i=;i<=n;i++)
{
if(a[i]>rem[len])
{
rem[++len]=a[i];
l[i]=len;
}
else
{
int left=,right=len;
while(left<right)
{
int mid=(left+right)/;
if(rem[mid]>=a[i])right=mid;
//此处必须取到=,否则相同的数将不被替换,而是替换成了第一个比它大的数
else left=mid+;
}
rem[left]=a[i];
l[i]=left;
}
} memset(rem,,sizeof(rem)); len=;
for(int i=n;i>=;i--)
{ if(a[i]>rem[len])
{
rem[++len]=a[i];
r[i]=len;
}
else
{
int left=,right=len;
while(left<right)
{
int mid=(left+right)/;
if(rem[mid]>=a[i])right=mid;
//此处必须取到=,否则相同的数将不被替换,而是替换成了第一个比它大的数
else left=mid+;
}
rem[left]=a[i];
r[i]=left;
}
} int maxx=;
for(int i=;i<=n;i++)
maxx=max(maxx,l[i]+r[i]-); cout<<n-maxx<<endl;
return ;
}
【题解】合唱队形——LIS坑爹的二分优化的更多相关文章
- 合唱队形(LIS)
合唱队形 OpenJ_Bailian - 2711 N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学不交换位置就能排成合唱队形. 合唱队形是指这样的一种队形:设K位同 ...
- P1091 合唱队形题解(洛谷,动态规划LIS,单调队列)
先上题目 P1091 合唱队形(点击打开题目) 题目解读: 1.由T1<...<Ti和Ti>Ti+1>…>TK可以看出这题涉及最长上升子序列和最长下降子序列 2 ...
- POJ 3903:Stock Exchange(裸LIS + 二分优化)
http://poj.org/problem?id=3903 Stock Exchange Time Limit: 1000MS Memory Limit: 65536K Total Submis ...
- 二分优化lis和STL函数
LIS:最长上升子序列: 这个题我们很显然会想到使用dp, 状态设计:dp[i]代表以a[i]结尾的LIS的长度 状态转移:dp[i]=max(dp[i], dp[j]+1) (0<=j< ...
- (LIS) P1091 合唱队形 洛谷
题目描述 NN位同学站成一排,音乐老师要请其中的(N-KN−K)位同学出列,使得剩下的KK位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2,…,K1,2,…,K,他 ...
- HDU 1025 LIS二分优化
题目链接: acm.hdu.edu.cn/showproblem.php?pid=1025 Constructing Roads In JGShining's Kingdom Time Limit: ...
- 新疆大学ACM-ICPC程序设计竞赛五月月赛(同步赛)C 勤奋的杨老师【DP/正反LIS/类似合唱队形】
链接:https://www.nowcoder.com/acm/contest/116/C 来源:牛客网 题目描述 杨老师认为他的学习能力曲线是一个拱形.勤奋的他根据时间的先后顺序罗列了一个学习清单, ...
- 二分优化的lis
/*此题为一个女大佬教我的,%%%%%%%%%%%%*/ 题目描述 给出1-n的两个排列P1和P2,求它们的最长公共子序列. 输入输出格式 输入格式: 第一行是一个数n, 接下来两行,每行为n个数,为 ...
- HDU 1025:Constructing Roads In JGShining's Kingdom(LIS+二分优化)
http://acm.hdu.edu.cn/showproblem.php?pid=1025 Constructing Roads In JGShining's Kingdom Problem Des ...
随机推荐
- mysql5.7免安装版配置
解压之后,新建一个my.ini 内容是: [mysql] # 设置mysql客户端默认字符集 default-character-set = utf8 [mysqld] #安装目录 basedir = ...
- 使用openmp进行并行编程
预处理指令pragma 在系统中加入预处理器指令一般是用来允许不是基本c语言规范部分的行为.不支持pragma的编译器会忽略pragma指令提示的那些语句,这样就允许使用pragma的程序在不支持它们 ...
- Android | 教你如何快速集成机器学习能力
背景 继上篇博文说了如何快速集成扫码以后 我又上官网去了解了一下其他的功能,其中机器学习服务是当下比较火的,而且还是免费的.就赶紧点进去学习一下.看看能够快速实现哪些功能. 链接在这里:https ...
- thinkphp5--多文件入口设置
来源:http://www.cnblogs.com/walblog/p/8035426.html 今天在用tp5做项目的时候发现,前台是可以绑定默认到index模块的,但是后台不好弄,于是查了一下手册 ...
- MySql id 设定为主键不自增后,再给 sort 字段增加自增属性
需求 id 已经被设置为主键,但是没有给它设置 自增 属性.sort 起到一个排序的作用,需要给它设置一个 自增 属性 加自增属性的前提 表中的属性没有增加自增 赋予自增属性的字段,必须带有 索引 S ...
- Spring Boot filter
在Spring Boot中自定义filter 本文我们将会讲解如何在Spring Boot中自定义filter并指定执行顺序. 定义Filter很简单,我们只需要实现Filter接口即可,同时我们可指 ...
- 【Linux常见命令】vi,vim命令
所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在. 但是目前我们使用比较多的是 vim 编辑器. vim 具有程序编辑的能力,可以主动的以字体颜色辨别语法的正 ...
- cobbler的网页操作
需求:安装一台服务器 1.指定两块网卡一块外网一块内网2.内网ip10.0.0.62外网为172.16.1.623.主机名为m02 开始吧! 1.添加镜像文件 2.创建ks文件 编写ks文件 附:ks ...
- XML--XML作用
XML 把数据从 HTML 分离 如果你需要在 HTML 文档中显示动态数据,那么每当数据改变时将花费大量的时间来编辑 HTML. 通过 XML,数据能够存储在独立的 XML 文件中.这样你就可以专注 ...
- Codeforce 140C (贪心+优先队列)补题
C. New Year Snowmen time limit per test2 seconds memory limit per test256 megabytes inputstandard in ...