题目链接


题目大意:

就是将一个长度为nnn的[1,2,3,4,5,6,...,n][1,2,3,4,5,6,...,n][1,2,3,4,5,6,...,n]的数组先向右旋转KKK步,然后在swapswapswap最多mmm次,现在给你最后的结果,问你KKK可能是什么?


解题思路:

又是一个小技巧
1.首先我们知道交换后再旋转,和旋转后再交换是一样的
2.对于两个全排列a,ba,ba,b的a−>ba->ba−>b的最小交换次数等于(ai,bi)(a_i,b_i)(ai​,bi​)连接无向边然后n−cn-cn−c然后ccc是图的联通块个数
3.但是每次检测是O(n)O(n)O(n)的我们不能对每个KKK都检测一遍
5.我们发现对于交换后,最多只会有2∗m2*m2∗m个数不在原来的位置,那么就有n−2∗mn-2*mn−2∗m会在原来的位置


#include <bits/stdc++.h>
#define mid ((l + r) >> 1)
#define Lson rt << 1, l , mid
#define Rson rt << 1|1, mid + 1, r
#define ms(a,al) memset(a,al,sizeof(a))
#define log2(a) log(a)/log(2)
#define lowbit(x) ((-x) & x)
#define IOS std::ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define INF 0x3f3f3f3f
#define LLF 0x3f3f3f3f3f3f3f3f
#define f first
#define s second
#define endl '\n'
using namespace std;
const int N = 2e6 + 10, mod = 1e9 + 9;
const int maxn = 500010;
const long double eps = 1e-5;
const int EPS = 500 * 500;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef pair<ll,ll> PLL;
typedef pair<double,double> PDD;
template<typename T> void read(T &x)
{x = 0;char ch = getchar();ll f = 1;while(!isdigit(ch)){if(ch == '-')f*=-1;ch=getchar();}while(isdigit(ch)){x = x*10+ch-48;ch=getchar();}x*=f;
}
template<typename T, typename... Args> void read(T &first, Args& ... args)
{read(first);read(args...);
}int n, m;
int arr[maxn], cnt[maxn];
vector<int> ans, Graph[maxn];
bool vis[maxn];void dfs(int u) {vis[u] = 1;for(auto it : Graph[u]) {if(vis[it]) continue;dfs(it);}
}inline bool check(int loop) {//先转再去check要多少次交换for(int i = 0; i < n; ++ i) Graph[i].clear(), vis[i] = 0;for(int i = 0; i < n; ++ i)Graph[arr[i]-1].push_back((i-loop+n)%n), Graph[(i-loop+n)%n].push_back(arr[i]-1);int tg = 0;for(int i = 0; i < n; ++ i)if(!vis[i])dfs(i),tg ++;return n - tg <= m;
}inline void slove() {ans.clear();cin >> n >> m;for(int i = 0; i < n; ++ i) cnt[i] = 0;for(int i = 0; i < n; ++ i) cin >> arr[i];for(int i = 0; i < n; ++ i) {int offset = i - (arr[i] - 1);if(offset < 0) offset += n;cnt[offset] ++;}for(int i = 0; i < n; ++ i)if(cnt[i] + 2 * m >= n && check(i)) ans.push_back(i);cout << ans.size() << " ";for(auto it : ans) cout << it << " ";cout << "\n";
}int main() {IOS;int T;cin >> T;while(T -- ) {slove();}return 0;
}

置换 ---- 两个置换最少swap次数 E. Permutation Shift相关推荐

  1. leetcode 高薪_利用两种不同的方法解LeetCode第1312题:让字符串成为回文串的最少插入次数

    题目描述(难度困难) 给你一个字符串 s ,每一次操作你都可以在字符串的任意位置插入任意字符.请你返回让 s 成为回文串的 最少操作次数 . 「回文串」是正读和反读都相同的字符串. 示例 1: 输入: ...

  2. 2.你有三个碗:分别是8,5,3公升容量。你能用最少的次数倒出两个四升水吗?

    问:你有三个碗:分别是8,5,3公升容量.你能用最少的次数倒出两个四升水吗? 从8升碗里倒5升水到5升碗里 从5升碗里倒3升水到3升碗里 把3升水倒回8升碗里 把5升碗里剩下的2升水倒进3升碗里 从8 ...

  3. LeetCode 1775. 通过最少操作次数使数组的和相等(贪心+双指针)

    文章目录 1. 题目 2. 解题 1. 题目 给你两个长度可能不等的整数数组 nums1 和 nums2 . 两个数组中的所有值都在 1 到 6 之间(包含 1 和 6). 每次操作中,你可以选择 任 ...

  4. 页面置换算法——最佳置换算法、最近最少使用算法、先进先出算法、时钟置换算法

    计算机操作系统--页面置换算法 根据中国大学MOOC计算机操作系统(电子科技大学)而写. 如果自己要设计页面置换,要根据什么原则来设计?我们首先想到的是存储器的局部性原理(时间局部性.空间局部性) P ...

  5. java简单巡回置换算法程序代码_巡回置换算法(巡回置换算法实现流程)

    LRU是Least Recently Used的缩写,即最近最少使用页面置换算法,是为虚拟页式存储管理服务的.LRU算法的提出,是基于这样一个事实:在前面几条指令中使用频繁的. 在一个请求分页系统中, ...

  6. 专题·置换【including 置换,置换快速幂,洛谷·[HNOI2001]洗牌机

    前言:若您手中有一本<组合数学>,那么请翻到P330看书吧,书上讲的是真的好.本文也基本参考该书讲解] 本篇博客算是后期两周内会写的一篇关于Polya定理的专题的前置知识] 目录 一.置换 ...

  7. python 数组排序最少交换次数_数组排序 使得交换次数最少

    题目: 给定一个包含1-n的数列,我们通过交换任意两个元素给数列重新排序. 求最少需要多少次交换,能把数组排成按1-n递增的顺序,(数组中的元素互不重复). 比如 初始状态 5 4 3 2 1 .交换 ...

  8. LeetCode简单题之使每位学生都有座位的最少移动次数

    题目 一个房间里有 n 个座位和 n 名学生,房间用一个数轴表示.给你一个长度为 n 的数组 seats ,其中 seats[i] 是第 i 个座位的位置.同时给你一个长度为 n 的数组 studen ...

  9. POJ2431贪心(最少加油次数)

    题意:        给一个终点,然后给你一个卡车距离终点的距离,还有其他个加油站距离终点的距离,然后每走一个单位距离要花费一个单位油,卡车的邮箱是无限大的,而每个加油站的油量是有限的,整个路径是一个 ...

最新文章

  1. 普渡大学李攀:好的图表示到底是什么?
  2. 树状数组 poj 2352
  3. 新建swap分区的规划、挂载和自动挂载示例
  4. 程序员修仙之路-数据结构之 CXO让我做一个计算器
  5. 警惕Oracle DB操作高压线
  6. dj电商-应用整合在一起,不完整版
  7. SQL - 创建一个学生表,要求有主键约束和非空约束
  8. 【转载】Kali-linux安装之后的简单设置
  9. Android基站定位——单基站定位(二)
  10. 第 42 章 RTC—实时时钟
  11. 计算机注销和重新启动的区别,注销和重启的区别(转载)
  12. word:回车替换成空格
  13. shell十三问(转)
  14. win10多用户同时远程桌面登陆Termsrv.dll(允许多个RDP会话)-win10最新2004版。
  15. CMock使用手册翻译
  16. [语音识别] 单音素、三音素、决策树
  17. 2020.7.25多态、抽象
  18. TCP的三次握手各字段(ack,seq,ACK,SYN)是什么意思?
  19. 老男孩教育Linux运维培训32期决心书
  20. mysql-基础-视图,存储过程,触发器

热门文章

  1. 遥感图像+CNN,预测区域人口收入水平
  2. JavaWeb实现分页的四种方法
  3. 微信程序跳转到页面底部 scroll-view
  4. Java线程池使用与原理
  5. 一个技术人的2016成长和2017小目标
  6. 编译GCC4.8.2
  7. html5日期转long
  8. Saltstack笔记
  9. MySQL主从同步问题集
  10. CentOS6.6+Puppet3.7.3分布式部署Zabbix2.4监控系统