CF1682C LIS or Reverse LIS?
题目大意:
设一个长为n的整数序列a是 [a_1,a_2,a_3,......,a_n]那么a'是 [a_n,a_n-1,a_n-2,......,a_1]LIS(a) 是a的最长严格递增子序列的长度。
现在给定a数组,对数组进行重排后,求min(LIS(a),LIS(a′))的最大值。
输入t组数据,每组数据先输入n,然后输入n个整数
输出t行,每行一组数据的答案,按输入顺序。
其实正解是不难想到的(可是原题翻译错了)。既然可以重排,又需要使数组顺序和逆序两种情况的LIS都尽可能大,那么思路就显而易见了:把所有数中最大的数放在数列的最中间,把剩下的数分成两部分,一部分放在最中间数的左边,要求这一部分的数按大小不下降进行排列,另一部分放在右边,要求按照大小不上升进行排列,同时,让这两部分数的个数尽可能相等。
注意到,在整个数列中,一种数的贡献最多为2,当它的个数为2时,一个放在左边,一个放在右边,如果大于2的话,那就无法有更多的贡献了。。因此我们需要记录每个数出现的次数,如果出现次数大于2,就不加上它的贡献。这样,遍历整个数列,加上贡献,最后除以二即可(因为加的是两边数列所有数的贡献),考虑到数可能很大,这里用map进行优化
然而这里有个特例,对于最中间的那一个数,它的贡献始终为2,因为左边的最长上升序列的终点是它,右边的最长下降序列的起点也是它,特殊处理即可。
__EOF__

本文作者:Never Gonna Give You Up!
本文链接:https://www.cnblogs.com/CZ-9/p/16471773.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/CZ-9/p/16471773.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
分类:
构造
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具