题目

【题目描述】
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. 聊聊Spring Boot Actuator

    概述 在本文中,我们将介绍Spring Boot Actuator.我们将首先介绍基础知识,然后详细讨论Spring Boot 1.x和2.x中的可用内容. 我们将在Spring Boot 1.x中学 ...

  2. How to change the header background color of a QTableView

    You can set the style sheet on the QTableView ui->tableView->setStyleSheet("QHeaderView:: ...

  3. [Qt] 通过socket将另一个程序的某个窗口调到最前端

    @ // THIS IS A HACK: // from QT documentation: // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ...

  4. java 8中构建无限的stream

    目录 简介 基本使用 自定义类型 总结 java 8中构建无限的stream 简介 在java中,我们可以将特定的集合转换成为stream,那么在有些情况下,比如测试环境中,我们需要构造一定数量元素的 ...

  5. 都2020年了,这5个java IDE神器你还不知道?

    TIOBE的4月份编程语言排行榜出来了,java还是稳坐第一位,java最新的版本也到了13,一直以来java凭借其企业级应用的优势和大量的框架级应用俘获了大量的粉丝和企业客户. 谈到开发者,java ...

  6. 从Spring迁移到Spring Boot

    文章目录 添加Spring Boot starters 添加应用程序入口 Import Configuration和Components 迁移应用程序资源 迁移应用程序属性文件 迁移Spring We ...

  7. JDK12的五大重要新特性

    文章目录 JDK12的五大重要新特性 引入JVM常量API 扩展了switch语句 支持Unicode 11.0 为日本Reiwa Era提供了方形字符支持 NumberFormat增加了对以紧凑格式 ...

  8. python- 函数高级

    函数高级 一.默认参数 1.默认参数概念 默认参数指函数/方法在定义时为形参赋值,对应的形参称为默认参数. 默认参数是一个参数定义期的概念,与调用无关. 2.默认参数的作用 如果参数定义默认参数,在调 ...

  9. 2019 ICPC 南京网络赛 H-Holy Grail

    As the current heir of a wizarding family with a long history,unfortunately, you find yourself force ...

  10. 从0开始搭建精灵宝可梦的检测APP

    从0开始搭建精灵宝可梦的检测APP 本文为本人原创,转载请注明来源链接 环境要求 Tensorflow1.12.0 cuda 9.0 python3.6.10 Android Studio Anaco ...