首页 > 其他分享 >ABC302G Sort from 1 to 4 [关键性质题]

ABC302G Sort from 1 to 4 [关键性质题]

时间:2024-10-11 16:32:40浏览次数:1  
标签:Sort ... int 关键 序列 长度 ABC302G

Description

给定一个长度为 \(N\) 的序列,其中每个元素都是介于 \(1\) 和 \(4\) 之间的整数。

可以进行以下操作任意次(可能为零次):

  • 选择一对整数 \((i, j)\),其中 \(1≤i<j≤N\),并交换 \(A_i\) 和 \(A_j\)。

输出使序列 \(A\) 变为非递减序列所需的最小操作次数。

Solution

对于这种交换数字,最小操作数是序列相等,或者什么单调性的题,可以优先想到逆序对和建图。

设原序列为 \(A=(A_1, A_2, ..., A_N)\),排序后为 \(B=(B_1, B_2, ..., B_N)\),

根据观察,若 \(A_i\ne B_i\),则我们用它们代表的数字建边 \(A_i\to B_i\),

由于每个点的出度和入度都相等,所以最终会形成若干个环,且根据 \(A_i\in [1,4]\) 这重要性质,可知环长不超过 \(4\),

考虑一个长度为 \(i\) 的环,要把它变为合法,需要 \(i-1\) 步,因此我们优先把长度为 \(2\) 的环交换,接着是 \(3\),最后是 \(4\),直接暴力枚举计算贡献即可。

Code

const int N = 2e5 + 5;

int n, a[N], b[N], e[5][5];

void Solve(){
    cin >> n;
    for(int i = 1; i <= n; i++){
        cin >> a[i];
        b[i] = a[i];
    }
    sort(b + 1, b + 1 + n);
    for(int i = 1; i <= n; i++){
        if(a[i] != b[i]) e[a[i]][b[i]]++;
    }

    ll ans = 0;

    for(int i = 1; i <= 4; i++){
        for(int j = 1; j <= 4; j++){
            if(e[i][j] && e[j][i]){
                ll mn = min(e[i][j], e[j][i]);
                ans += mn;
                e[i][j] -= mn;
                e[j][i] -= mn;
            }
        }
    }

    for(int i = 1; i <= 4; i++){
        for(int j = 1; j <= 4; j++){
            for(int k = 1; k <= 4; k++){
                if(i == j || j == k || k == i) continue;
                if(e[i][j] && e[j][k] && e[k][i]){
                    ll mn = min({e[i][j], e[j][k], e[k][i]});
                    ans += mn * 2;
                    e[i][j] -= mn;
                    e[j][k] -= mn;
                    e[k][i] -= mn;
                }
            }
        }
    }

    ll tmp = 0;
    for(int i = 1; i <= 4; i++){
        for(int j = 1; j <= 4; j++){
            tmp += e[i][j];
        }
    }
    tmp /= 4;
    tmp *= 3;
    ans += tmp;

    cout << ans << endl;
}

标签:Sort,...,int,关键,序列,长度,ABC302G
From: https://www.cnblogs.com/chenwenmo/p/18458757

相关文章

  • 大模型存储选型 & JuiceFS 在关键环节性能详解
    从去年开始,LLM大语言模型领域发展迅速、如LLaMA、ChatGLM、Baichuan、Qwen和yi-model等基础模型(FoundationModels)的数量显著增加。众多企业也开始基于这些基础模型做post-training的相关工作,以开发特定垂直领域的模型实现应用落地。AI模型的参数规模呈指数级增长,出现了越......
  • 考研报名证件照上传指南及关键注意事项
    考研将近,有很多同学仍然对考研报名证件照的问题不太清楚。今天,我就来为大家详细说明一下考研报名证件照的上传流程和要求。1、考研报名阶段不需要上传照片。在研招网的预报名和正式报名期间,你只需要填写相关信息即可。真正的上传材料环节是在报名结束后的网上确认阶段,预计时......
  • Volatile关键字以及JMM内存模型
    JMM内存模型:这个简单来说就是一个规范,对数据进行计算的时候先从主内存中读取到PC寄存器然后进行计算之后将计算的结果最后再放入到主内存中下面以i++的计算过程为例子:引申出这种情况下的三大特性(线程安全):1.原子性:当线程对资源进行操作的时候不能被其他线程所打断......
  • 1688商品数据深度剖析:优化供应与销售策略的关键
    一、关键信息提取与分析商品数量:从API接口数据中提取商品总数,以及各类别下的商品数量。分析商品数量的分布情况,识别出热门类别和冷门类别。对比不同时间段的商品数量变化,评估商品上新速度和趋势。销售额:提取销售额数据,包括总销售额、各类别销售额、以及热销商品的销售......
  • C语言——static 关键字与 const 关键字
    static静态的        一、static修饰局部变量——称为静态局部变量                static改变了局部变量的生命周期(本质上是改变了变量的存储类型),当被static修饰时,局部变量由栈区存放到了静态区。voidtest(){intnum=1;printf("%d......
  • 电力系统的负荷损失和潮流计算matlab仿真,对比最高度数,最高介数以及最高关键度等节点
    1.课题概述     节点攻击是指针对电力系统中某个或多个节点进行的攻击,其目的是破坏电力系统的稳定性和安全性。节点攻击可以分为最高度数攻击、最高介数攻击和最高关键度攻击等。在本课题中,将模拟这四种攻击方式,对比电力系统的停电规模。 2.系统仿真结果  3.核......
  • synchronized关键字的使用和原理
    在Java中,synchronized关键字是一种用于实现线程同步的机制,它可以确保在同一时刻只有一个线程能够访问被synchronized修饰的代码块或方法。一、作用和原理互斥访问:synchronized关键字通过对共享资源加锁来实现互斥访问。当一个线程进入synchronized代码块或方法时,它会获取......
  • 不容忽视的PCB测试点,关键时刻可以避免批量事故哦!
    ​ PCB测试点是啥子?请看下图: ​如果你曾经用过NOKIA手机,每次你打开后盖换电池的时候,每次看到的那两排圆形的点——就是PCB测试点,oryoucancallitTestPointinEnglish.NOKIA手机的测试点有什么用?为什么要留这两排测试点?我虽然不知道NOKIA手机这些测试点的具体作用......
  • 了解final关键字在Java并发编程领域的作用吗?
    在Java并发编程领域,final关键字扮演着一个至关重要的角色。虽然很多同学熟悉final用于修饰变量、方法和类的基本用法,但其在并发环境中的应用和原理却常常被忽视。final关键字不仅仅是一个简单的修饰符,它在多线程编程中确保对象状态的可见性和不变性,这对于构建线程安全的应用至关重......
  • 创建索引时需要考虑的关键问题详解
    引言在数据库中,索引是加快数据查询速度的重要工具。通过索引,数据库可以快速定位需要的数据,而无需扫描整个表的数据。尽管索引能极大提高查询效率,但不合理的索引设计也可能导致性能下降,甚至增加不必要的系统开销。尤其在高并发的大规模数据系统中,索引的设计与优化直接关系到......