首页 > 其他分享 >[排序,贪心,置换环]洛谷P1327&&P8637,双倍经验

[排序,贪心,置换环]洛谷P1327&&P8637,双倍经验

时间:2023-12-19 17:57:22浏览次数:42  
标签:排序 洛谷 int 置换 交换 E6% P1327 && include

前置知识: 置换环,最小交换次数

https://blog.csdn.net/yunxiaoqinghe/article/details/113153795?ops_request_misc=&request_id=&biz_id=102&utm_term=%E6%9C%80%E5%B0%91%E4%BB%BB%E6%84%8F%E4%BA%A4%E6%8D%A2%E6%8E%92%E5%BA%8F%E8%AF%81%E6%98%8E%E7%94%A8%E7%BD%AE%E6%8D%A2&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-.pc_search_download_positive&spm=1018.2226.3001.4187

知道引理之后,我们可以很轻松的证明,我们在循环中执行的每一组交换操作,实际上就对应一个置换环。

代码:

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <cstring>
#include <unordered_map>
#define For(i, j, n) for(int i = j ; i <= n ; ++i)
using namespace std;

const int N = 1e5 +5;

int n;
int a[N], b[N];
unordered_map<int, int> F;

int main()
{
    int ans = 0;
    scanf("%d", &n);
    for(int i = 1; i <= n; i++)
    {
        scanf("%d", &a[i]);
        b[i] = a[i];
    }
    sort(b + 1, b + n + 1);
    for(int i = 1; i <= n; i++)
        F[b[i]] = i;
    for(int i = 1; i <= n; i++)
        while(a[i] != b[i])
        {
            swap(a[i], a[F[a[i]]]);
            ans++;
        }
    cout << ans << endl;
    return 0;
}

先通过排序,把每个数最后应该在的实际位置存下来,然后再根据这个结果进行交换和统计答案。

tips:

为什么不能在快速排序/归并排序的过程中顺便记录交换次数?

因为这些排序算法虽然是基于排序里面最优的,但是他们每次循环中也只能让当前的序列更靠近有序序列,他们所执行的步数>=ans,试想一下,如果能够在一遍排序的过程中直接统计出答案的话,那么这些排序的复杂度也就不会是NlogN了,就直接是N,这显然是存在矛盾的。

 

标签:排序,洛谷,int,置换,交换,E6%,P1327,&&,include
From: https://www.cnblogs.com/smartljy/p/17914350.html

相关文章

  • 「杂题乱刷」洛谷P9533
    题目链接诈骗题。容易证明,翻转任意一个“灵异区间”时,整个序列的“灵异区间”的数量总数都不会变,因此我们直接输出原数列的“灵异区间”的总数即可。参考代码:点击查看代码/*Tips:你数组开小了吗?你MLE了吗?你觉得是贪心,是不是该想想dp?一个小时没调出来,是不是该考虑换题?*......
  • 「杂题乱刷」洛谷P2426
    题目链接一道简单区间dp。设\(dp_i\)为删到第\(i\)个数时的最大值,状态转移方程也挺好写的。时间复杂度\(O(n^2)\)。参考代码:点击查看代码/*Tips:你数组开小了吗?你MLE了吗?你觉得是贪心,是不是该想想dp?一个小时没调出来,是不是该考虑换题?*/#include<bits/stdc++.h......
  • 【洛谷 P1923】【深基9.例4】求第 k 小的数(快速排序)
    【深基9.例4】求第k小的数题目描述输入(且为奇数)个数字(),输出这些数字的第小的数。最小的数是第小。请尽量不要使用nth_element来写本题,因为本题的重点在于练习分治算法。输入格式输出格式样例#1样例输入#15143215样例输出#12思路先快速排序,然后通过数组索引访......
  • 洛谷 P9936 [NFLSPC #6] 等差数列
    洛谷传送门对\((i,a_i)\)求出下凸包,那么一条凸包的斜率非正的切线是候选答案。只考虑切凸包上第\(i\)个点的切线,那么斜率的左边界是过凸包第\(i\)和第\(i+1\)个点的直线斜率,右边界是过凸包第\(i-1\)和第\(i\)个点的直线斜率。最优方案的切线斜率一定要么贴着左......
  • 洛谷P1824 进击的奶牛 题解 二分答案
    题目链接:https://www.luogu.com.cn/problem/P1824题目大意:本题相当于在\(n\)个数中选\(c\)个数,使得这\(c\)个数中相差最小的两个数之差尽可能地大。解题思路:我们首先可以给\(a_1\sima_n\)从小到大排一下序(这里有点贪心的思想,你会发现很多涉及贪心的问题在排序之后解......
  • 洛谷 P1217
    原题链接:一开始的思路:把数字转换成字符串类型并将字符串反转,若反转后的字符串和原来的字符串一致且该数是质数,则是回文质数。#include<bits/stdc++.h>usingnamespacestd;boolisPrime(intx){if(x<2)returnfalse;for(inti=2;i<=x/i;i++){......
  • 【洛谷 P1271】【深基9.例1】选举学生会 题解(计数排序)
    【深基9.例1】选举学生会题目描述学校正在选举学生会成员,有名候选人,每名候选人编号分别从1到,现在收集到了张选票,每张选票都写了一个候选人编号。现在想把这些堆积如山的选票按照投票数字从小到大排序。输入格式输入和以及个选票上的数字。输出格式求出排序后的选票编......
  • [NOIP2010 提高组] 关押罪犯 - 洛谷
    P1525[NOIP2010提高组]关押罪犯-洛谷|计算机科学教育新生态(luogu.com.cn)种类并查集#include<bits/stdc++.h>#definedebug(a)cout<<#a<<"="<<a<<'\n';usingnamespacestd;usingi64=longlong;typedefpair<i64,i64>......
  • 洛谷P3396 哈希冲突
    根号分治模板题#include<iostream>#include<stdio.h>#include<algorithm>#include<cstring>#include<cmath>#defineRED"\033[0;32;31m"#defineNONE"\033[m"#defineR(x)x=read()#defineFor(i,j,n)for......
  • 洛谷P4199 万径人踪灭
    题目链接考虑容斥:拿满足条件\(1\)的方案数减去满足条件\(1\)但不满足条件\(2\)的方案数就是答案。满足条件\(1\)但不满足条件\(2\)的方案可以用\(\text{Manacher}\)算法\(O(n)\)计算。对于满足条件\(1\)的总方案数,我们记\(c_i\)表示以\(i\)位置为对称轴时,......