题目

【题目描述】
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坑爹的二分优化的更多相关文章

  1. 合唱队形(LIS)

    合唱队形    OpenJ_Bailian - 2711 N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学不交换位置就能排成合唱队形. 合唱队形是指这样的一种队形:设K位同 ...

  2. P1091 合唱队形题解(洛谷,动态规划LIS,单调队列)

    先上题目 P1091 合唱队形(点击打开题目) 题目解读: 1.由T1​<...<Ti​和Ti​>Ti+1​>…>TK​可以看出这题涉及最长上升子序列和最长下降子序列 2 ...

  3. POJ 3903:Stock Exchange(裸LIS + 二分优化)

    http://poj.org/problem?id=3903 Stock Exchange Time Limit: 1000MS   Memory Limit: 65536K Total Submis ...

  4. 二分优化lis和STL函数

    LIS:最长上升子序列: 这个题我们很显然会想到使用dp, 状态设计:dp[i]代表以a[i]结尾的LIS的长度 状态转移:dp[i]=max(dp[i], dp[j]+1) (0<=j< ...

  5. (LIS) P1091 合唱队形 洛谷

    题目描述 NN位同学站成一排,音乐老师要请其中的(N-KN−K)位同学出列,使得剩下的KK位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2,…,K1,2,…,K,他 ...

  6. HDU 1025 LIS二分优化

    题目链接: acm.hdu.edu.cn/showproblem.php?pid=1025 Constructing Roads In JGShining's Kingdom Time Limit: ...

  7. 新疆大学ACM-ICPC程序设计竞赛五月月赛(同步赛)C 勤奋的杨老师【DP/正反LIS/类似合唱队形】

    链接:https://www.nowcoder.com/acm/contest/116/C 来源:牛客网 题目描述 杨老师认为他的学习能力曲线是一个拱形.勤奋的他根据时间的先后顺序罗列了一个学习清单, ...

  8. 二分优化的lis

    /*此题为一个女大佬教我的,%%%%%%%%%%%%*/ 题目描述 给出1-n的两个排列P1和P2,求它们的最长公共子序列. 输入输出格式 输入格式: 第一行是一个数n, 接下来两行,每行为n个数,为 ...

  9. 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 ...

随机推荐

  1. BI报表分析和数据可视化,推荐这三个开源工具!

    开源篇 一.Superset 1.技术架构:Python + Flask + React + Redux + SQLAlchemy 2.使用人群: (1)开发/分析人员做好看板,业务人员浏览看板数据 ...

  2. 【已解决】error setting certificate verify locations报错

    目录 1.问题描述 2.问题分析 3.解决方法 1.问题描述 在公司的电脑上从Github上clone项目的时候git黑窗口报错"error setting certificate veri ...

  3. Java 集合框架总结--导图

    java的集合导图总结:

  4. 日志分析工具ELK(二)

    五.Logstash日志收集实践 在学习Logstash之前,我们需要先了解以下几个基本概念: logstash收集日志基本流程: input-->codec-->filter--> ...

  5. OpenCV学习(4)——动态结构

    学习一个新知识,无外乎学习它本身和它的工具.OpenCV提供许多内置的结构及处理函数,非常值得学习. 内存存储 在OpenCV中,内存存储器是一个可以用来存储序列.数组和图像的动态增长的数据结构.它由 ...

  6. 本周ASP.NET英文技术文章推荐[02/03 - 02/16]:MVC、Visual Studio 2008、安全性、性能、LINQ to JavaScript、jQuery...

    摘要 继续坚持,继续推荐.本期共有9篇文章: 最新的ASP.NET MVC框架开发计划 Visual Studio 2008 Web开发相关的Hotfix发布 ASP.NET安全性教程系列 ASP.N ...

  7. CreateDIBSection和位图结构

    2019独角兽企业重金招聘Python工程师标准>>> 理解分辨率 我们常说的屏幕分辨率为640×480,刷新频率为70Hz,意思是说每行要扫描640个象素,一共有480行,每秒重复 ...

  8. 在sun jdk 8镜像基础上构建maven 3的docker镜像

    2019独角兽企业重金招聘Python工程师标准>>> 在https://my.oschina.net/ytqvip/blog/1595054文章的sun jdk 8镜像基础上构建m ...

  9. Azkaban3.81.x部署+坑

    一.前提安装 1.1 Java1.8环境搭建 1) 下载jdk1.8并解压: # tar -zxvf jdk-8u201-linux-i586.tar.gz -C /usr/local 2) 添加Ja ...

  10. Win10美吱er吱er,Win10修改默认字体的方法

    请参考以下步骤(需要修改注册表,修改前请先备份,以便在出现问题时能够及时恢复): 例:将系统字体改为宋体 1.Windows+r,输入:regedit 2.定位以下路径:HKEY_LOCAL_MACH ...