首页 > 其他分享 >Educational Codeforces Round 152 (Rated for Div. 2)E. Max to the Right of Min(数据结构,分治)

Educational Codeforces Round 152 (Rated for Div. 2)E. Max to the Right of Min(数据结构,分治)

时间:2023-08-27 19:55:46浏览次数:46  
标签:std Educational Rated Min int mi pop st LMIN

题目链接:https://codeforces.com/problemset/problem/1849/E

 

大致题意:

 

长度为n的序列,求有多少个区间满足区间最大值在区间最小值的右边?

 

解题思路:

 

(此题有使用线段树等其他做法,本处使用的是单调栈做法)

 

我们先求出每个a【i】 的左边的比他小的LMIN,左边比他大的LMAX,右边比他大的RMAX,右边比他小的RMIN;

 

我们枚举每个a【i】为最大值,此刻以他为最大值的区间为,L= LMAX【i】,R = RMAX【i】;

 

1:枚举k从 i 到 L+1 :

 

以k为左端点的时候,比 k 到 i 中的数都  小的 数在 x 的时候,

  a: x < i,那么答案增加 i - x

  b:x > R时,答案增加R - i

其他时候答案不增加

 

2:枚举k从i 到R-1;

 

以k为右端点的时候,比i到k中的数都小的数在x的时候,

  如果x大于L,那么答案增加x-L

其他时候答案都不增加

 

以上结论都是比较显然的,读者可以思考一下就推出;

 

复杂度的话,我们将俩种情况结合起来,也就是,如果 i - L < R - i,那么使用第一种情况,否则使用第二种情况;

我们思考区间最大值从大到小来看,每个区间扫描都会不大于之前那个区间的一半;

 

故时间复杂度:O(nlogn);

 

代码:

#include<bits/stdc++.h>

signed main()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(0); std::cout.tie(0);

    int n; std::cin >> n;

    std::vector<int> a(n + 1, 0);

    std::vector<int> LMIN(n + 1, 0), LMAX(n + 1, 0), RMIN(n + 1, n + 1), RMAX(n + 1, n + 1);

    for (int i = 1; i <= n; ++i)std::cin >> a[i];

    std::stack<int> st;

    for (int i = 1; i <= n; ++i)
    {
        while (st.size() && a[st.top()] > a[i])RMIN[st.top()] = i, st.pop();
        st.push(i);
    }
    while (st.size())st.pop();

    for (int i = 1; i <= n; ++i)
    {
        while (st.size() && a[st.top()] < a[i])RMAX[st.top()] = i, st.pop();
        st.push(i);
    }
    while (st.size())st.pop();

    for (int i = n; i >= 1; --i)
    {
        while (st.size() && a[st.top()] > a[i])LMIN[st.top()] = i, st.pop();
        st.push(i);
    }
    while (st.size())st.pop();

    for (int i = n; i >= 1; -- i)
    {
        while (st.size() && a[st.top()] < a[i])LMAX[st.top()] = i, st.pop();
        st.push(i);
    }
    while (st.size())st.pop();

    //for (int i = 1; i <= n; ++i)std::cout << LMIN[i] << " \n"[i == n];
    //for (int i = 1; i <= n; ++i)std::cout << LMAX[i] << " \n"[i == n];
    //for (int i = 1; i <= n; ++i)std::cout << RMIN[i] << " \n"[i == n];
    //for (int i = 1; i <= n; ++i)std::cout << RMAX[i] << " \n"[i == n];

    long long ans = 0;

    for (int i = 1; i <= n; ++i)
    {
        int L = LMAX[i], R = RMAX[i];

        if (i - L < R - i)
        {
            int mi = RMIN[i], I = i;
            for (int j = i; j > L; --j)
            {
                if (a[j] < a[I])I = j;
                mi = RMIN[I];
                if (mi >= R)ans += R - i - (i == j);
                else if (mi > i)ans += mi - i - (i == j);
            }
        }
        else
        {
            int mi = LMIN[i], I = i;
            for (int j = i; j < R; ++j)
            {
                if (a[j] < a[I])I = j;
                mi = LMIN[I];
                if (mi > L)ans += mi - L;
                //std::cout << mi << " " << L << "\n";
            }
        }
        //std::cout << ans << "\n";
    }

    std::cout << ans << "\n";

    return 0;
}

其实说难也不是很难,就是需要考虑的有些细:)

标签:std,Educational,Rated,Min,int,mi,pop,st,LMIN
From: https://www.cnblogs.com/ACMER-XiCen/p/17659031.html

相关文章

  • Windows10 环境下使用 Cmake 和 MinGW-w64 编译安装 OpenCV 4.0.1
    Windows10环境下使用Cmake和MinGW-w64编译安装OpenCV4.0.1翻译搜索复制......
  • Reminisce.ai - 更快理解新技术的人工智能学习应用
    什么是Reminisce.aiReminisce.ai是一个人工智能驱动的学习应用。它旨在帮助用户以最快的速度理解各种新技术的高层架构,比如React、Django、AWS等。Reminisce.ai非常适合需要经常学习使用新技术的人群,比如程序员、IT从业人员、学生等。它可以大大缩减用户理解新技术所需的时间,......
  • minio 使用(Win)
    下载:https://www.minio.org.cn/download.shtml基本使用设置密码(设置环境变量):setxMINIO_ROOT_USERadminsetxMINIO_ROOT_PASSWORDpassword启动(先切换到minio.exe所在路径):minio.exeserverD:\Data--console-address:9001--address:13328server后的路径为minio......
  • Adding a gitolite-controlled repository to Redmine
    Currently,weuse gitolite toaccesscontrolourGitrepositories.Inaddition,weuse Redmine tomanageourprojects.ThestandardinstallationofRedminecanonlyaccessalocalGitrepositoryviadirectaccesstothefilesystem.Unfortunately,Redmine......
  • 上市公司绿色创新效率数据计算(text mining方法的使用)
    需求:工作中需要计算上市公司绿色创新效率数据,需要首先利用text_preprocessing对文本提取值进行预处理,然后通过Textmining方法进行转换后计算处理,最后利用效率法来进行综合计算和归类存储,用于后续的深度数据挖掘。解决:importnltkfromnltk.corpusimportstopwordsfromnltk.tok......
  • AGC008C Tetromino Tiling
    需要注意细节的图形趣题。给出如下图的\(7\)种俄罗斯方块各\(a,b,c,d,e,f,g\)块,可以旋转不能翻转,要求拼成宽度为\(2\)的长方形。输出能得到的最大长度的一半。不难发现,第\(3,6,7\)种方块压根用不上,因为它们造成了长度为\(1\)的凹槽,而这些凹槽永远不可能被填平:要填平......
  • fastadmin列表宽度变小,如何让列字段内容自动换行
    首先,正常来讲,fastadmin列宽度没有属性约束,会随着字段值的长度自动伸缩。但fastadmin可以控制列的宽度,看一下控制列宽度后的样式。{field:'filename',title:'附件名称',cellStyle:function(){return{css:{"max-width":"150px",}}}},如下图 但这样不美观,如何让字......
  • windows 桌面GUI自动化- 17.pywinauto 设置全局等待时间Timings
    前言pywinauto查找窗口和控件时会有超时时间与轮询机制,可以通过timings模块设置全局等待时间。timings模块timings模块有三个模式可以设置timings.Timings.fast()快速模式timings.Timings.defaults()默认模式timings.Timings.slow()慢速模式以下是可以调整的......
  • Jenkins +miniprogram-ci 构建 发布、预览微信小程序
           #!/bin/bash-lrm-rfqrcode*.jpgyarnyarnwxcitype=$actionappid=$appidversion=$versiondesc=$descbuildId=${BUILD_ID}#计算过期时间,并将过期时间写进自定义环境变量#计算过期时间,并将过期时间写进自定义环境变量now=`date'+%Y-%m-%d%H......
  • 思维导图神器 xmind 使用过程的一些问题汇总
    xmind是一款商业思维导图(Mindmap)软件,目前有3个版本:xmind,,xmindPlus,xmindPro。其中xmindPlus,xmindPro是商业软件,并且是xmind公司的主要产品。更多的是面向商业付费用于,包含了类似"头脑风暴","演示模式","录音","过滤","搜索"等高级功能。软件采用目前全球最先进的EclipseRCP软......