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

06-21 1128阅读

一、题目

1、题目描述

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

2、输入输出

2.1输入

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

2.2输出

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

3、原题链接

Problem - 1237D - Codeforces


二、解题报告

1、思路分析

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

很容易证明

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

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

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

然后对于递推求解ans

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

如果k

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

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

2、复杂度

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

3、代码详解

 ​
#include 
using i64 = long long;
using i128 = __int128;
using PII = std::pair;
std::ostream& operator> 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  
VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]