二分+ST表+递推,Cf 1237D - Balanced Playlist

news2024/10/6 12:19:12

一、题目

1、题目描述

2、输入输出

2.1输入

2.2输出

3、原题链接

Problem - 1237D - Codeforces


二、解题报告

1、思路分析

case3提示我们一件事情:如果存在某个位置永远不停止,那么所有位置都满足永远不停止

很容易证明

随着下标右移,区间最大值不会变大,那么后面2倍大于旧的最大值的数的二倍仍然大于新的最大值

那么对于每个位置我们要找到第一个满足a[i] < max / 2的 i

我们可以st表预处理出区间最大值最小值

然后对于递推求解ans

对于i,我们二分查找找到第一个大于a[i]的j,同样二分查找找到第一个a[k] < a[i]的k

如果k < j,那么显然答案就是j - i

否则, ans[i] = k - i + ans[k % N]

我们建立了递推关系,一共N个状态,每个状态O(log)转移,总体时间复杂度就是O(NlogN)

2、复杂度

时间复杂度: O(NlogN)空间复杂度:O(NlogN)

3、代码详解

 ​
#include <bits/stdc++.h>
using i64 = long long;
using i128 = __int128;
using PII = std::pair<int, int>;

std::ostream& operator<< (std::ostream& out, i128 x) {
    std::string s;
    while (x) s += ((x % 10) ^ 48), x /= 10;
    std::reverse(s.begin(), s.end());
    return out << s;
}

template<class T, int M>
struct ST {
    T n;
    std::vector<T> nums;
    std::vector<T> log2;
    std::vector<std::array<T, M>> f0, f1;

    ST (T _n, std::vector<T>& _nums): n(_n), nums(_nums), log2(_n + 1), f0(_n), f1(_n) {
        log2[2] = 1;
        for (int i = 3; i <= n; i ++ ) log2[i] = log2[i >> 1] + 1;
        for (int i = 0; i < n; i ++ ) f0[i][0] = f1[i][0] = nums[i];
        for (int j = 1; j < M; j ++ )
            for (int i = 0; i < n && i + (1 << (j - 1)) < n; i ++ )
                f0[i][j] = std::max(f0[i][j - 1], f0[i + (1 << (j - 1))][j - 1]), 
                f1[i][j] = std::min(f1[i][j - 1], f1[i + (1 << (j - 1))][j - 1]);
    }

    std::array<T, 2> query(int l, int r) {
        int k = log2[r - l + 1];
        return { std::max(f0[l][k], f0[r - (1 << k) + 1][k]), 
            std::min(f1[l][k], f1[r - (1 << k) + 1][k]) };
    }
};

void solve() {
    int N;
    std::cin >> N;
    std::vector<int> a(N * 2);
    for (int i = 0; i < N; i ++ ) 
        std::cin >> a[i], a[i + N] = a[i];
    ST<int, 18> st(N * 2, a);
    if (st.query(0, N - 1)[0] <= st.query(0, N - 1)[1] * 2LL) {
        for (int i = 0; i < N; i ++ ) std::cout << -1 << " \n"[i == N - 1];
        return;
    }
    std::vector<int> ans(N, -1);
    auto findmi = [&](int l, int r) -> int {
        int x = a[l - 1];
        while (l < r) {
            int mid = l + r >> 1;
            auto [ma, mi] = st.query(l, mid);
            if (mi * 2LL < x) r = mid;
            else l = mid + 1;
        }
        return l;
    };
    auto findma = [&](int l, int r) -> int {
        int x = a[l - 1];
        while (l < r) {
            int mid = l + r >> 1;
            auto [ma, mi] = st.query(l, mid);
            if (ma > x) r = mid;
            else l = mid + 1;
        }   
        return l;
    };

    auto dfs = [&](auto&& self, int x) -> int {
        if (~ans[x]) return ans[x];
        int lt = findmi(x + 1, x + N), gt = findma(x + 1, x + N);
        if (lt < gt) return ans[x] = lt - x;
        return ans[x] = gt - x + self(self, gt % N);
    };
    for (int i = 0; i < N; i ++ ) 
        std::cout << dfs(dfs, i) << " \n"[i == N - 1];
}   

int main(int argc, char** argv) {
    std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0);
    int _ = 1;
    // std::cin >> _;
    while (_ --)
        solve();
    return 0;
}

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

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

相关文章

一键铺货、多商户入驻:了解迅狐多语言跨境商城源码的商业优势

迅狐多语言跨境商城源码是一款创新的电商平台解决方案&#xff0c;具有独特的商业优势。其中&#xff0c;一键铺货和多商户入驻是其核心功能之一&#xff0c;为商家提供了便利和灵活性。 一、一键铺货&#xff1a;简化产品上架流程 对于电商卖家来说&#xff0c;上架商品是一…

LSS 和 BEVDepth算法解读

前言 当前BEV的研究大都基于深度学习的方法&#xff0c;从组织BEV特征信息的方式来看&#xff0c;主流方法分属两类&#xff1a;自底向上方法和自顶向下方法。 自底向上方法比较早的代表工作是LSS&#xff0c;后来BEVDet、BEVDepth等也是基于LSS的框架来进行优化。自底向上方…

qt dll编写和调用

dll编写 新建项目 头文件 #ifndef LIB1_H #define LIB1_H#include "lib1_global.h"class LIB1_EXPORT Lib1 { public:Lib1(); };//要导出的函数&#xff0c;使用extern "C"&#xff0c;否则名称改变将找不到函数extern "C" LIB1_EXPORT int ad…

汽车传动系统为汽车动力总成重要组成部分 我国市场参与者数量不断增长

汽车传动系统为汽车动力总成重要组成部分 我国市场参与者数量不断增长 汽车系统主要包括动力系统、制动系统、传动系统、转向系统、行驶系统、燃油供给系统、照明系统以及电器系统。汽车传动系统指能够将发动机产生的动力转化为车辆行驶驱动力的动力传递装置。汽车传动系统为汽…

什么是电表无人抄表?

1.电表无人抄表&#xff1a;智能时代的新式计量方法 随着科技的发展的迅猛发展&#xff0c;传统电表抄表方法正被一种全新的、高效率的方式所替代——电表无人抄表。这类技术的普及&#xff0c;不仅提升了电力行业的经营效率&#xff0c;同时也为用户增添了更贴心的服务。 2.…

Python邮箱发送如何设置?Python发信方法?

Python邮箱发送邮件需要哪些库&#xff1f;怎么使用Python发信&#xff1f; Python的强大之处在于其丰富的库和模块&#xff0c;使得开发者可以轻松地实现各种功能&#xff0c;包括通过电子邮件发送信息。AokSend将介绍如何在Python中设置和发送电子邮件&#xff0c;以及相关的…

多功能电能表抄表

1.多功能电能表抄表&#xff1a;简述 多功能电能表抄表是一种现代化电力计量方法&#xff0c;它不仅能够纪录电力耗费&#xff0c;还能提供多种多样额外功能&#xff0c;如实时检测、故障预警、远程操作等。相对于传统电度表&#xff0c;它大大提高了电力管理的效率和精确性。…

浅谈网络通信(2)

文章目录 一、TCP1.1、TCP提供的api —— ServerSocket 、Socket1.2、使用TCP协议编写回显服务器1.3、长/短连接 二、应用层协议、传输层协议详解2.1、应用层(后端开发必知必会)2.1.1、自定义应用层协议2.1.2、通用的协议格式2.1.2.1、XML2.1.2.2、json2.1.2.3、protobuffer 2.…

kotlin类型检测与类型转换

一、is与!is操作符 1、使用 is 操作符或其否定形式 !is 在运行时检测对象是否符合给定类型。 fun main() {var a "1"if(a is String) {println("a是字符串类型:${a.length}")}// 或val b a is Stringprintln(b) } 二、"不安全的"转换操作符…

ARM32开发--IIC原理

知不足而奋进 望远山而前行 目录 文章目录 前言 目标 内容 I2C通讯规则 I2C写操作 I2C读流程 通讯信号 开始 结束 发送数据 bit发送 Byte发送 等待响应 接收数据 bit接收 Byte接收 发送响应 总结 前言 在现代消费电子和工业电子领域&#xff0c;各种类型的…

如何察觉自己或者家人是否出现了听力问题?

如何察觉自己或者家人是否出现了听力问题呢&#xff1f;可以从以下两个方面观察&#xff1a; 一&#xff0e;社交方面 • 是不是经常需要别人重复刚说的话才能理解&#xff1f; • 多人对话中是否感到吃力&#xff1f; • 觉得别人讲话含糊不清&#xff1f; • 在人多嘈杂…

YASKAWA机器人HW1171921-B电缆维修

安川机器人作为现代工业自动化的重要设备&#xff0c;其稳定运行对于生产线的连续性和效率至关重要。然而&#xff0c;随着使用时间的增长&#xff0c;可能会出现各种YASKAWA机器人本体线缆故障&#xff0c;如断线、短路、接触不良等。 一、安川工业机器人电缆维修前的准备 在进…

【Python】已解决报错 TypeError: Missing 1 Required Positional Argument

本文摘要&#xff1a;【Python】使用 Python 中将字符串转换为数组&#xff0c;并总结提出了几种可用方案。 &#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博…

谁才是产品界的真正王者?AI产品经理对决普通产品经理!

不同类型的产品经理可能有着不同的工作内容&#xff0c;那么&#xff0c;AI产品经理和普通产品经理之间的工作内容、工作职责、技能要求等方面&#xff0c;存在着哪些具体差异&#xff1f;这篇文章里&#xff0c;作者就进行了总结和梳理&#xff0c;一起来看看吧。 一、工作内容…

R语言绘制三变量分区地图

参考资料&#xff1a; https://mp.weixin.qq.com/s/5c7gpO2mJ2BqJevePJz3CQ tricolore包教程&#xff1a;https://github.com/jschoeley/tricolore 学习笔记&#xff1a;Ternary choropleth maps 1、测试实例 代码&#xff1a; library(ggplot2) library(rnaturalearthdata) …

「漏洞复现」I Doc View 在线文档预览 qJvqhFt.json 任意文件读取漏洞(XVE-2024-2115)

0x01 免责声明 请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;作者不为此承担任何责任。工具来自网络&#xff0c;安全性自测&#xff0c;如有侵权请联系删…

手机如何找回我的相册?来看这篇文章,2个方法即刻获取

手机相册已经成为我们存储和分享生活瞬间的重要工具&#xff0c;每当我们在旅行、聚会或其他重要时刻拍摄下一张张珍贵的照片时&#xff0c;相册就成为了我们回味这些瞬间的宝贵载体。然而&#xff0c;当我们不小心删除了相册时&#xff0c;那些曾经美好的回忆似乎也随之消失了…

沸点 | LDBC与SIGMOD联合研讨,推动图数据库创新与标准化

当地时间6月9日&#xff0c;国际基准官方平台关联数据基准委员会&#xff08;LDBC&#xff0c;Linked Data Benchmark Council&#xff09;与SIGMOD 2024&#xff08;是全球最具国际影响力的数据管理、数据处理和数据存储领域的学术顶会之一&#xff0c;ACM SIGMOD/Big Data in…

win11联想版,如何下载Visual Basic 6.0精简版

一、背景 Visual Basic 6.0精简版、Visual Basic Mini&#xff0c;等 Win11系统&#xff0c;网上找压缩包下载&#xff0c;无法成功。 二、解决 通过下载联想应用商店&#xff0c;在应用商店中下载 步骤一 hi&#xff0c;推荐你使用联想应用商店&#xff0c;商店提供上万款…

【大分享03】浙江某区县“个人全生命周期档案”综合智治应用实践

关注我们 - 数字罗塞塔计划 - 本篇是参加由电子文件管理推进联盟联合数字罗塞塔计划发起的“大分享”活动投稿文章&#xff0c;来自杭州安铂数据科技有限公司&#xff0c;作者&#xff1a;智治项目组。 一. 项目概述 根据《政务服务电子文件归档和电子档案管理办法》&#xf…