COCI 2021-2022 #1 - Volontiranje 题解

news2024/11/15 12:28:52

题目大意

让你求最多有多少个不相交的最长上升子序列。

思路

我们可以将数 a i a_i ai 看成一个点 ( i , a [ i ] ) (i,a[i]) (i,a[i]),于是我们可以按照 x x x 递增 y y y 递减考虑分层。

分层的方法就是从 1 1 1 到当前点的 LIS 即为其所在层数。

此时 LIS 的长度就是层数,再考虑对于序列的可能性。

此时不能简单的想为每一层的数的个数的最小值,如下图就是一个反例。

在这里插入图片描述
我们直接贪心每一个序列能否填当前数即可,如果贪心不出来,即在下一层找不到满足条件的点,就直接弹出即可。

具体判断可以看代码实现。

时间复杂度是 O ( n ⋅ log ⁡ n ) O(n\cdot \log n) O(nlogn)

代码

#include <bits/stdc++.h>
using namespace std;
int n, m, b[1000005], s[1000005], a[1000005], nxt[1000005];
vector<int> ans[1000005];
int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) {//分层
        scanf("%d", &a[i]);
        int l = 1, r = m, mid;
        while (l <= r) {
            mid = l + r >> 1;
            if (a[b[mid]] > a[i])
                r = mid - 1;
            else
                l = mid + 1;
        }
        if (r == m)
            m++, b[m] = i, s[m]++;
        else
            nxt[i] = b[r + 1], b[r + 1] = i, s[r + 1]++;
    }
    int minn = 0, ansm = 0;
    for (int i = 1; i <= m; i++) minn |= (s[i] == 0);
    while (minn == 0) {//判断每一个数列是否可行
        ansm++;
        for (int j = 1; j <= m; j++) {
            while (!ans[ansm].empty() && b[j] != 0 && a[b[j]] < a[ans[ansm].back()])
                b[j] = nxt[b[j]], s[j]--, minn |= (s[j] == 0);
            if (b[j] == 0) {
                minn = 1;
                ansm--;
                break;
            }
            if (!ans[ansm].empty() && b[j] < ans[ansm].back()) {//此时上一个数在这一层找不到任何x,y都比它大的数
                j -= 2, ans[ansm].pop_back();
                continue;
            }
            ans[ansm].push_back(b[j]), b[j] = nxt[b[j]], s[j]--, minn |= (s[j] == 0);
        }
    }
    printf("%d %d\n", ansm, m);
    for (int i = 1; i <= ansm; i++, printf("\n"))
        for (auto g : ans[i]) printf("%d ", g);
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1075451.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring源码解析——IOC之bean 的初始化

正文 一个 bean 经历了 createBeanInstance() 被创建出来&#xff0c;然后又经过一番属性注入&#xff0c;依赖处理&#xff0c;历经千辛万苦&#xff0c;千锤百炼&#xff0c;终于有点儿 bean 实例的样子&#xff0c;能堪大任了&#xff0c;只需要经历最后一步就破茧成蝶了。…

Git 学习笔记 | Git 分支

Git 学习笔记 | Git 分支 Git 学习笔记 | Git 分支分支的概念为什么要使用分支&#xff1f;常用指令 Git 学习笔记 | Git 分支 分支的概念 几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作从开发主线上分离开来&#xff0c;避免影响开发主线。…

小白网络安全学习手册(黑客技术)

一、网络安全应该怎么学&#xff1f; 1.计算机基础需要过关 这一步跟网安关系暂时不大&#xff0c;是进入it行业每个人都必须掌握的基础能力。 计算机网络计算机操作系统算法与数据架构数据库 Tips:不用非要钻研至非常精通&#xff0c;可以与学习其他课程同步进行。 2.渗透技…

[idekCTF 2022]Paywall - LFI+伪协议+filter_chain

[idekCTF 2022]Paywall 一、解题流程&#xff08;一&#xff09;、分析&#xff08;二&#xff09;、解题 二、思考总结 一、解题流程 &#xff08;一&#xff09;、分析 点击source可以看到源码&#xff0c;其中关键部分&#xff1a;if (isset($_GET[p])) {$article_content…

【C语言】进阶——动态内存管理

一、为什么存在动态内存管理 我们已经掌握的内存开辟方式有&#xff1a; int val 20; //在栈空间开辟四个字节char arr[10] {0}; //在栈空间开辟10个字节的连续空间 但上述开辟空间的方式有两个特点&#xff1a; 空间开辟大小是固定的数组在声明的时候&#xf…

Maven最新版本安装及配置

Maven是一个Java项目管理和构建工具&#xff0c;它可以定义项目结构、项目依赖&#xff0c;并使用统一的方式进行自动化构建&#xff0c;是Java项目不可缺少的工具。 本章我们详细介绍如何使用Maven。 一、Maven是什么&#xff1f; 如果每一个项目都自己搞一套配置&#xf…

【java学习】一维数组(9)

文章目录 1. 一维数组声明2. 一维数组初始化3. 数组元素的引用4. 数组元素的默认初始化 1. 一维数组声明 声明方式&#xff1a; type var[] 或 type[] var 例如&#xff1a; int a[]; int[] a1; double b[]; Mydate[] c; //对象数组2. 一维数组初始化 动态初始化&#xf…

python练习4

前言&#xff1a;相信看到这篇文章的小伙伴都或多或少有一些编程基础&#xff0c;懂得一些linux的基本命令了吧&#xff0c;本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python&#xff1a;一种编程语言&…

2023年十大顶尖远程控制软件

随着科技的不断进步和时代的发展&#xff0c;远程控制软件已经成为现代工作、教育等领域中必不可少的工具。这些软件可以实现远程桌面连接、远程支持和远程维护等功能&#xff0c;大大提高了工作效率&#xff0c;同时也让用户拥有更加灵活的操作方式。当然&#xff0c;不同的远…

C#:出题并判断

C#:出题并判断 //出题并判断 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace Test_…

【高阶数据结构】图详解第二篇:图的遍历(广度优先+深度优先)

文章目录 图的遍历1. 图的广度优先遍历&#xff08;一石激起千层浪&#xff09;思路分析代码实现测试美团2020校招笔试题&#xff1a;六度人脉 2. 图的深度优先遍历&#xff08;一条道走到黑&#xff09;思路分析代码实现测试 3. 对于非连通图情况的处理4.源码BFSDFS 图的遍历 …

uboot启动流程-run_main_loop 到 cmd_process处理说明一

一. uboot启动 uboot命令模式&#xff1a;uboot 启动以后会进入 3 秒倒计时&#xff0c;如果在 3 秒倒计时结束之前按下按下回车键&#xff0c;那么就会进入 uboot 的命令模式。 如果在 uboot 倒计时结束以后都没有按下回车键&#xff0c;就会自动启动 Linux 内 核 …

C++结构体(struct)、结构体和函数、结构体指针

前言 在本文中&#xff0c;您将学习C 编程中的结构。它是什么&#xff0c;如何定义它并在程序中使用它。结构是一个单一名称下不同数据类型的变量的集合。它与类相似&#xff0c;两者都保存着不同数据类型的数据集合。 问题 例如&#xff1a;您要存储有关某个人的一些…

《向量数据库指南》——向量数据库 大模型的“海马体”

在大模型的高调火热之下,向量数据库也获得了前所未有的关注。 近两个月内,向量数据库迎来融资潮,Qdrant、Chroma、Weaviate先后获得融资,Pinecone宣布1亿美元B轮融资,估值达到7.5亿美元。 东北证券预测,到2030年,全球向量数据库市场规模有望达到500亿美元,国内向量数…

【LeetCode热题100】--155.最小栈

155.最小栈 设计一个支持 push &#xff0c;pop &#xff0c;top 操作&#xff0c;并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获取堆栈顶部的元…

dubbo协议与triple协议的对比

分别使用dubbo协议和triple协议&#xff0c;按照官方文档搭建Demo。 两个流程对比下来发现&#xff0c;dubbo协议搭建起来比较简单直接&#xff0c;定义好接口&#xff0c;实现类&#xff0c;然后启动provider和consumer就完事了。而triple协议则需要先定义proto文件 然后增加…

(StackOverflow问答)使用Huggingface Transformers从磁盘加载预训练模型

这是在Stack Overflow上的一个问答&#xff0c;链接如下&#xff1a; Load a pre-trained model from disk with Huggingface Transformers - Stack Overflowhttps://stackoverflow.com/questions/64001128/load-a-pre-trained-model-from-disk-with-huggingface-transformers…

找不到vcomp140.dll,无法继续执行代码?别担心,解决方法在这里!

找不到vcomp140.dll,无法继续执行代码&#xff1f;这个问题很难解决么&#xff1f;在网上看到很多人在咨询这个问题&#xff0c;看来是很多人都遇到了缺失了vcomp140.dll文件的问题啊&#xff0c;小编觉得很有必要来给大家详细的科普一下vcomp140.dll文件&#xff0c;给大家介绍…

测试老鸟整理,Fiddle抓包实战-App数据包抓取,看这一篇就够了...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 我们在做接口测试…

在线剪辑音频教程,从零开始,轻松上手

“在线怎么剪辑音频呀&#xff1f;最近参加了一个线上的歌手大赛&#xff0c;好不容易过了初赛&#xff0c;复赛要求我们准备一首流行歌曲&#xff0c;可是我的音频出了问题&#xff0c;需要进行剪辑&#xff0c;但是我不会进行操作&#xff0c;想求求大家帮帮忙。” 在这个数…