D. Lucky Permutation(置换环)

这篇具有很好参考价值的文章主要介绍了D. Lucky Permutation(置换环)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


D. Lucky Permutation
严格鸽题解大家可以看看这篇题解,有图片辅助,写的十分的好

题意

题意:给我们一个数长度为n的数组,我们每次操作可以任选两个数进行交换。问我们最后得到满足逆序对是一的序列的最小操作次数是多少。

思路

思路:我们不难知道每次交换两个相邻的数就会形成一个逆序对。

我们考虑置换环,置换环是啥(置换环就是我们对于每一个结点,将其指向排序之后它应该在的地方,直至形成一个环)。

明白置换环什么意思之后,不明白也没关系,我们来举个具体的例子,首先我们给出一个排列 [ 1 , 3 , 4 , 5 , 2 , 6 ] [1,3,4,5,2,6] [1,3,4,5,2,6],那么现在假设我们想让它变成一个单调递增的序列及 [ 1 , 2 , 3 , 4 , 5 , 6 ] [1,2,3,4,5,6] [1,2,3,4,5,6],那对于1和6来说就是一个自环,因为1和6最后指向的位置都是自己。那么3,4,5,2就会形成一个环,及 2 − > 3 − > 4 − > 5 − > 2 2->3->4->5->2 2>3>4>5>2,环内有四个点,我们只需要用3步就可以变成单增的序列。也就是说每一个环内相当于只有一个点是不会改变的。那我们的操作次数就是n-环的个数。因为要保证有且仅有一个逆序对我们还得进行一次操作就是任意交换两个相邻的数得到一个逆序对多以操作次数再加1.

我们再考虑一种情况,那就是任意一个置换环内如果有两个数是相邻的,我们能不能省去一步操作呢。答案是可以的,还是上面那个例子,我们现在有一个环是 [ 3 , 4 , 5 , 2 ] [3,4,5,2] [3,4,5,2]我们可以进行一步操作得到 [ 3 , , 4 , 2 , 5 ] [3,,4,2,5] [3,,4,2,5],然后我们再进行一步操作可以得到 [ 3 , 2 , 4 , 5 ] [3,2,4,5] [3,2,4,5]那么现在我们观察一下这个序列是不是已经存在了一个 [ 3 , 2 ] [3,2] [3,2]的逆序对了,那我们就不需要再还原然后交换相邻的位置了。

AC代码

#include <bits/stdc++.h>
using namespace std;

const int N = 2e5 + 10;
int p[N], vis[N];
map<int, int> ring;
int flag;

void dfs(int u)
{
	if (vis[u])
		return;
	vis[u] = 1;
	ring[u] = 1;
	int v = p[u];
	if (ring[u - 1] || ring[u + 1])
		flag = 1;
	dfs(v);
}

void solve()
{
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++)
		vis[i] = 0;
	for (int i = 1; i <= n; i++)
		cin >> p[i];
	int cur = 0;
	flag = 0;
	for (int i = 1; i <= n; i++)
		if (!vis[i])
		{
			cur++;
			ring.clear();
			dfs(i);
		}

	if (flag)
		cout << n - cur - 1 << endl;
	else
		cout << n - cur + 1 << endl;
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int T;
	cin >> T;
	while (T--)
	{
		solve();
	}
	return 0;
}

总结:思维不够开阔,想不到可以用图来解决这类问题,然后接触的知识点还是少,别人一眼就能看出来是置换环,多做题多积累。文章来源地址https://www.toymoban.com/news/detail-414944.html

到了这里,关于D. Lucky Permutation(置换环)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Lucky67蓝牙5.2双模热插拔PCB

    LDN通用蓝牙双模固件和驱动使用帮助文档请点击如下链接: 功能参考链接 请参阅这个链接 1、先把排线的插头对正小板和大板的插座,再插入,注意方向不要插错,不要大力出奇迹,否则容易怼弯插座里的针,或者搞坏插座。 2、 不要插电池 ,然后插入USB,此时电脑应可以

    2024年02月08日
    浏览(63)
  • cf1772 E. Permutation Game

    题目链接:Problem - E - Codeforces  题意:给一个 n 个数的数组(由1-n乱序),所有元素初始被染成 红色 , 玩家轮流。在他们的回合,玩家可以做以下三个动作之一: 重新排列排列的元素,使所有 红色 元素保持其位置(请注意, 蓝色 元素可以相互交换,但不是强制性的);

    2024年02月13日
    浏览(33)
  • STL—next_permutation函数

    目录 1.next_permutation函数的定义 2.简单使用 2.1普通数组全排列  2.2结构体全排列 2.3string 3.补充 next_permutation函数 会按照字母表顺序生成给定序列的 下一个较大的排列 ,直到整个序列为 降序 为止。与其相对的还有一个函数—— prev_permutation函数。 next_permutaion(起始地址,末尾

    2024年02月04日
    浏览(80)
  • 【Atcoder】 [ARC159C] Permutation Addition

    Atcoder方向 Luogu方向 首先考虑是否有可行的方案 从数列总和方向考虑 最终每个数相同,那么 s u m sum s u m 一定是 n n n 的倍数 同时每次数列会加上 n ( n + 1 ) 2 frac{n(n+1)}{2} 2 n ( n + 1 ) ​ 考虑对 n n n 分奇偶考虑 n为奇数,那么 n ( n + 1 ) 2 frac{n(n+1)}{2} 2 n ( n + 1 ) ​ 一定是 n n n 的倍

    2024年02月16日
    浏览(25)
  • Application of Permutation and Combination

    目录 Summary Reference Online Tool Cracking the Safe! 计算比赛前三名有多少种排列方式? Can you win the lottery? How make a pill? Think 如果你遇到的问题,自己不确定是排列还是组合,但确定想求出摆放的全部方式,那么可以用逐步分析法。 0.首先确定这个问题的次序重要不? 1.重要 重要就用

    2024年02月08日
    浏览(23)
  • D. 1D Eraser

    time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output You are given a strip of paper s that is n cells long. Each cell is either black or white. In an operation you can take any k consecutive cells and make them all white. Find the minimum number of operations needed to remove all black cells. Inpu

    2024年02月08日
    浏览(35)
  • D. Bracket Coloring

    判断是否可以将字符串s分成若干字子串,使每个子串或每个翻转的子串是合法的括号序列。 首先要知道如何判断一个括号序列是否是合法,共有两个条件: 1.左括号数=右括号数 2.对于任意位置i,i前的左括号数一定大于等于右括号数(即右括号数不大于左括号数) 这个字符

    2024年02月10日
    浏览(23)
  • c++入门必学库函数 next_permutation

    next_permutation的意思是下一个排列,与其相对的是prev_permutation,即上一个排列。我们需要使用全排列的时候就可以直接使用这两个函数,方便又快捷 由于prev_permutation和next_permutation的用法是一样的,下面就值讲解next_permutation的基本用法 next_permutation只能获得上一个排列,如果要

    2024年02月02日
    浏览(25)
  • D. Maximum Distance(最小生成树)

    Problem - D - Codeforces   Chouti已经厌倦了乏味的作业,于是他打开了数年前创建的一个旧编程问题。 给定一个具有n个节点和m条加权边的连通无向图。其中有k个特殊节点:x1,x2,...,xk。 现在定义路径的成本为其边权的最大值。两个顶点之间的距离定义为连接它们的路径的最小成本

    2024年02月01日
    浏览(39)
  • JavaScript激活严格模式

    在JavaScript中,严格模式是一种特殊的模式,通过’use strict’;去激活严格模式!在 JavaScript 中,“use strict” 是一种指令,表示在代码运行时启用严格模式,从而禁止使用一些不安全或者不规范的语法,减少代码出错的可能性。 看上面的代码,意思如果你通过测试,你可以拿

    2024年02月13日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包