牛客练习赛126(O(n)求取任意大小区间最值)

牛客练习赛126(O(n)求取任意大小区间最值)

牛客练习赛126

A.雾粉与签到题

题意:给出长度为n的数组, 顺序选出任意三个元素,最小化第二个元素

思路:

遍历除了第一个和最后一个元素取最小值即可

AC code:

c 复制代码
void solve() {
    int n; cin >> n;
    vector<int> a(n);
    map<int, int> mp;
    for (int i = 0; i < n; i ++) cin >> a[i];
    int mn = 1e18;
    for (int i = 1; i < n - 1; i ++) mn = min(mn, a[i]);
    cout << mn << endl;
}

B.雾粉与数论

题意:给你一个正整数 n n n,请你输出对每个 2 ≤ i ≤ n 2 \le i \le n 2≤i≤n, gcd ⁡ ( i ∗ ( i − 1 ) 2 , i ∗ ( i + 1 ) 2 ) \gcd(\frac {i*(i-1)} 2, \frac {i*(i+1)} 2) gcd(2i∗(i−1),2i∗(i+1)) 之和对 1 0 9 + 7 10^9+7 109+7 取模。

思路:打表发现规律,奇数直接对答案贡献自身,偶数贡献/2,注意,取模一定要最后取,过程中取模会影响最后结果。

AC code:

c 复制代码
void solve() {
    int n; cin >> n;
    int ans = (n * (n + 1) / 2 - 1);
    int ca = n / 2;
    int t = ca * (ca + 1) / 2;
    ans -= t;
    cout << ans % MOD << endl;
}

C.雾粉与最小值(简单版)

题意:

给一个长度为 n n n 的正整数数组 a a a,一个长度为 m m m 的查询数组 q q q, q i = ( v a l , m i n l e n , m a x l e n ) qi = (val, minlen, maxlen) qi=(val,minlen,maxlen)。 请你按输入顺序处理这 m m m 次查询,对于第 i i i 次查询 q i = ( v a l , m i n l e n , m a x l e n ) qi = (val, minlen, maxlen) qi=(val,minlen,maxlen): 请你输出是否存在一个 a a a 的子数组 s s s 满足 m i n ( s ) ≥ v a l min(s) \ge val min(s)≥val 且 s s s 的长度在 m i n l e n minlen minlen 和 m a x l e n maxlen maxlen 之间。

思路:

  • 首先,预处理除当前元素自身外,最小前缀元素的下标位置,和,最小后缀元素的下标位置,首尾第一个元素分别为-1和n;

  • 然后,对于每个元素x,我们要找出,当x作为某个连续子序列中元素的最小值时,该子序列最长为多少;

  • 通过预处理出的l和r元素,x, x, x, l, x, i, x, x, x, r, x, x,对于元素i,前缀最小为l,则l及之前的序列不能包含,否则会覆盖i作为子序列的最小值,同理,r及其之后的也不能涵盖,则当 a i a_i ai作为某个连续子序列中元素的最小值时, 最长为(r - l - 1)的子序列大小;

  • 依次处理出上述序列后,我们需要进行后缀最值处理,因为长度为n的序列最大的最小值成立,则长度为n-1上同样成立, 从而覆盖未处理过的区间大小;

    比如5 5 5 5 5,每个区间都能扩展5 5 5 5 5,覆盖的只有大小为5的区间长度,对于1 2 3 4的区间长度,通过取后缀最大即可覆盖;

  • 最后得到每个区间大小的最大的最小值;

AC code:

c 复制代码
void solve() {
    int n; cin >> n;
    vector<int> a(n);
    for (int i = 0; i < n; i ++) cin >> a[i];
    int mn = *min_element(a.begin(), a.end()), mx = *max_element(a.begin(), a.end());
    
    vector<int> mp(n + 1, -1);
    vector<int> l(n), r(n);
    deque<int> dq;
    for (int i = 0; i < n; i ++) { 
        while (!dq.empty() && a[dq.back()] >= a[i])
            dq.pop_back();
        l[i] = (dq.empty()) ? -1 : dq.back();
        dq.push_back(i);
    }
    
    dq.clear();
    for (int i = n - 1; i >= 0; i --) { 
        while (!dq.empty() && a[dq.back()] >= a[i])
            dq.pop_back();
        r[i] = (dq.empty()) ? n : dq.back();
        dq.push_back(i);
    }

    for (int i = 0; i < n; i ++) {
        int len = r[i] - l[i] - 1;
        mp[len] = max(mp[len], a[i]);
    }  
    for (int i = n - 1; i >= 0; i --) {
        mp[i] = max(mp[i], mp[i + 1]);
    }
    int m; cin >> m;
    while (m --) {
        int s, l, r; cin >> s >> l >> r;
        if (s <= mn) cout << "Yes" << endl;
        else if (s > mx) cout << "No" << endl;
        else {
            if (mp[l] >= s) cout << "Yes" << endl;
            else cout << "No" << endl;
        }
    }
}
相关推荐
AI科技星4 分钟前
引电统一方程:严格推导与量纲零错误验证
人工智能·算法·机器学习·架构·学习方法
壹号用户9 分钟前
C++入门(引用)
数据结构·c++
lcj251118 分钟前
【list】手撕C++ list!从0到1实现双向链表,迭代器、const迭代器、模板全解析,面试官都惊呆了!
c++·笔记·链表·list
8Qi831 分钟前
LeetCode 518:零钱兑换 II(Coin Change II)—— 题解 ✅
java·算法·leetcode·动态规划·完全背包
计算机安禾32 分钟前
【算法分析与设计】第49篇:算法博弈论与机制设计
人工智能·算法·机器学习
玖釉-40 分钟前
Vulkan Specialization Constants 详解:在“运行时配置”和“编译期优化”之间取得平衡
c++·windows·图形渲染
05候补工程师1 小时前
【408 数据结构】图论核心算法(拓扑/关键路径)与二叉搜索树精髓夺分笔记
数据结构·经验分享·笔记·考研·算法·图论
AC赳赳老秦1 小时前
OpenClaw+MySQL 深度应用:自动生成建表语句、索引优化建议与数据迁移脚本
开发语言·数据库·人工智能·python·mysql·算法·openclaw
奔袭的算法工程师1 小时前
论文解读--BEV-radar:: bidirectional radar-camera fusion for 3D object detection
人工智能·算法·目标检测·计算机视觉·自动驾驶·信号处理
-FxYaM-1 小时前
【UE】渲染框架学习路径-初次修改源码
服务器·网络·c++·windows·ue5·unreal engine