• 【每日一题】code-festival-2016-qualc C - Two Alpinists | 分类讨论 |简单


    题目内容

    原题链接

    给定两个长度为 n n n 的数组 b b b c c c ,下标从 0 0 0 开始
    b i = max ⁡ ( a 0 , a 1 , ⋯   , a i ) b_i=\max(a_0,a_1,\cdots,a_i) bi=max(a0,a1,,ai)
    c i = max ⁡ ( a n − 1 , a n − 2 , ⋯   , a i ) c_i=\max(a_{n-1},a_{n-2},\cdots,a_i) ci=max(an1,an2,,ai)

    问可以构造出多少个不同的 a a a a i a_i ai 是正整数。

    答案对 1 0 9 + 7 10^9+7 109+7 取模。

    数据范围

    • 1 ≤ n ≤ 1 0 5 1\leq n\leq 10^5 1n105
    • 1 ≤ b i ≤ 1 0 9 , b i ≤ b i + 1 1\leq b_i\leq 10^9,b_i\leq b_{i+1} 1bi109,bibi+1
    • 1 ≤ c i ≤ 1 0 9 , c i ≥ c i + 1 1\leq c_i\leq 10^9,c_i\geq c_{i+1} 1ci109,cici+1

    题解

    考虑 b i > b i − 1 b_{i}> b_{i-1} bi>bi1 ,则 a i = b i a_{i}=b_{i} ai=bi ,此时 c i ≥ b i c_i\geq b_i cibi
    考虑 c i > c i + 1 c_{i}> c_{i+1} ci>ci+1,则 a i = c i a_i=c_i ai=ci ,此时 b i ≥ c i b_i\geq c_i bici

    这里我们还需要特判 b 0 ≤ c 0 b_0\leq c_0 b0c0 b n − 1 ≥ c n − 1 b_{n-1}\geq c_{n-1} bn1cn1

    如果 b i = b i − 1 b_i=b_{i-1} bi=bi1 c i = c i + 1 c_i=c_{i+1} ci=ci+1 ,则 a i ∈ [ 1 , min ⁡ ( b i , c i ) ] a_i\in [1,\min(b_i,c_i)] ai[1,min(bi,ci)] a i a_i ai 共这么多种选择。

    时间复杂度: O ( n ) O(n) O(n)

    代码

    #include 
    using namespace std;
    
    const int MOD = 1e9 + 7;
    
    int main()
    {
        int n;
        cin >> n;
    
        vector<int> b(n), c(n);
        for (int i = 0; i < n; ++i) cin >> b[i];
        for (int i = 0; i < n; ++i) cin >> c[i];
    
        if (b.front() > c.front() || b.back() < c.back()) {
            cout << "0\n";
            return 0;
        }
    
        bool ok = true;
        int ans = 1;
        for (int i = 1; i + 1 < n; ++i) {
            if (b[i] > b[i - 1]) {
                if (c[i] < b[i]) {
                    ok = false;
                    break;
                }
            } else if (c[i] > c[i + 1]) {
                if (c[i] > b[i]) {
                    ok = false;
                    break;
                }
            } else {
                ans = 1ll * ans * min(b[i], c[i]) % MOD;
            }
        }
    
        if (ok) cout << ans << "\n";
        else cout << 0 << "\n";
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
  • 相关阅读:
    计算机的另一半
    ZOTERO入门小白教程【安装+插件】
    “构建高效的SpringMVC增删改查应用“
    Golang-GJSON 快速而简单的方法来从 json 文档获取值
    HashMap不安全后果及ConcurrentHashMap线程安全原理
    江苏服务器租用风险有哪些?
    关于阿里云中RDS数据库的CPU使用率和内存使用率的20道面试题
    git关闭commit时的语法检测husky
    Springboot龙龙汽车配件网站88000计算机毕业设计-课程设计-期末作业-毕设程序代做
    简述Linux磁盘IO
  • 原文地址:https://blog.csdn.net/weixin_43900869/article/details/132847992