首页 > 其他分享 >D1. Range Sorting (Easy Version)(单调栈+思维)

D1. Range Sorting (Easy Version)(单调栈+思维)

时间:2023-05-15 17:45:07浏览次数:71  
标签:Sorting sta int 最大值 第二段 Range Version 排序 代价

题目

题意

  • 给一个整数n和一个数组a[1~n]
  • 一次次排序操作的代价是,r - l
  • 求把所有子数组,排成有序的最小代价和

思路

easy版本可以用O(\(n^2\))的算法,我们可以枚举左右端点

假设一段的最优排序方法如图

img

任意长度的一段序列排序可能是排序多个子序列

所以我们需要讨论加上一个点的情况

  1. 一号点比之前所有点大,所以不需要排序
  2. 二号点在第二段中间,所以需要和第二段放在一起排序,代价+1
  3. 三号点和第二段一起排序,代价+1,同上一情况
  4. 观察可以发现,把四号点排序需要和第一段和第二段一起排序,相当于合并了这两个段,代价合并段的长度+1
  5. 同上一步情况

讨论出了所有的情况,就可以发现这个思路类似单调栈

找到第一个段上最大值小于当前添加值的段,然后合并(弹出后操作,再返回栈中)

但是需要注意的是,这个单调栈维护的是一个段的信息,即段中的最大值

所以在栈中放入,每个段中的最大值,还要用已有的最大值来更新,之后放入的最大值

代码

int a[N];
int n;

void solve()
{
    cin >> n;
    for(int i = 1;i <= n;i ++)cin >> a[i];

    int ans = 0;
    for(int i = 1;i <= n;i ++)
    {
        stack<int> sta;
        for(int j = i;j <= n;j ++)
        {
            int cur = a[j];
            while(sta.size() && sta.top() > a[j])
            {
                cur = max(cur,sta.top());
                sta.pop();
            }
            sta.push(cur);
            ans += j - i + 1 - sta.size();
        }
    }
    cout << ans << endl;
}

标签:Sorting,sta,int,最大值,第二段,Range,Version,排序,代价
From: https://www.cnblogs.com/cfddfc/p/17402622.html

相关文章

  • 3D打印机报错!! {"code":"key243","msg":"Move out of range: 20.852 29.68
    修改配置文件stepper_z的配置终点需要改下,看你热床允许的倾斜度,相对于归零点,负的,最大的值 ......
  • 解决IntelliJ 中reload maven module 导致 Target bytecode Version重置
    JDK17.0.7IntelliJIDEA2023.1.1<properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compi......
  • 如何查看CUDNN版本号,如果cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_
    https://github.com/pjreddie/darknet/issues/2356#issuecomment-756701965请看这个issuesudocpcuda/include/cudnn*.h/usr/local/cuda/includesudocpcuda/lib64/libcudnn*/usr/local/cuda/lib64sudochmoda+r/usr/local/cuda/include/cudnn.h/usr/local/cuda/......
  • 迁移到 Gradle 7.x 使用 Version Catalogs 管理依赖
    一、根目录下build.gradle变更变更前:buildscript{ext.kotlin_version='1.5.0'repository{repository{mavenCentral()jcenter()}dependencies{classpath'com.android.tools.build:gradle:4.0.2'......
  • Lagrange Multiplier Method
    LagrangeMultiplierMethod目录LagrangeMultiplierMethodPrerequisiteknowledge-partialderivativesUsageExSummaryTheEndofInequality:"\(\textsf{LagrangeMultiplierMethod}\)"Prerequisiteknowledge-partialderivativesInanutshell:pri......
  • 【五期邹昱夫】CCF-A(NeurIPS'21)Gradient inversion with generative image prior
    "JeonJ,LeeK,OhS,etal.Gradientinversionwithgenerativeimageprior[J].Advancesinneuralinformationprocessingsystems,2021,34:29898-29908."  本文提出了一种基于预训练模型的梯度反演方法。该方法通过使用潜在空间搜索优化维度较低的特征向量,减少......
  • Codeforces 1781H1 - Window Signals (easy version)
    很套路的一道题,把F1写了,F2感觉和F1gap不太大就懒得写了/shui首先需要明白大致思路:直接计算\(2^{nm-k}-1\)之所以会算重,是因为对于同一种图案,可能把它放在很多位置都是合法的。那么显然我们需要选一个代表元来把它的贡献唯一化,非常自然的想法就是把它固定在最左上角那个合......
  • Range Pair Distance Query
    洛谷6778给定一棵\(n\)个点的树,边带权(\(<2^{32}\)),\(q\)次查询\(\sum_{l\lei<j\ler}dis(i,j)\)。其中\(dis(i,j)\)代表点\(i\)到\(j\)的距离。......
  • Python range function All In One
    PythonrangefunctionAllInOnerange函数函数语法range(stop)range(start,stop[,step])参数说明:start:计数从start开始。默认是从0开始。例如range(5)等价于range(0,5)stop:计数到stop结束,但不包括stop。例如:range(0,5)是[0,1,2,3,4]没有......
  • 在计算语义相似度中,我看网上说要加range,我不知道往哪里加?
    大家好,我是皮皮。一、前言前几天在Python白银交流群【王王雪饼】问了一个Python处理语义相似度的问题,这里拿出来给大家分享下。二、实现过程这里【eric】了解到她的原始数据和停用词啥的都在自己的,代码套用的作者的,估计还是会遇到些问题的,如下图所示:后来【甯同学】给了一个......