题目链接:点击查看

题目大意:假设初始时的数组为 [1,2,3,...,n][1,2,3,...,n][1,2,3,...,n],同时 kkk 为偏移量,则原数组会循环右移 kkk 个单位,假设 k=3,n=5k=3,n=5k=3,n=5,则偏移后的数组为 [3,4,5,1,2][3,4,5,1,2][3,4,5,1,2]

现在给出一个数组,问能否通过至多 mmm 次交换,使得其变成偏移 kkk 个单位后的数组,如果可以的话,哪些 kkk 是符合条件的

题目分析:假设 kkk 是固定的,就变成了经典的置换群求换问题。简单说一下就是,我们最终的目标是需要得到 nnn 个自环,假设现在的置换群中有 ttt 个环,每次交换可以使得自环的个数增加 111,所以至少需要 n−tn-tn−t 次交换才能达到目标。这个可以 O(n)O(n)O(n) 去解决。

所以一个 O(n2)O(n^2)O(n2) 的解决方法就出来了,比赛的时候也是感觉可能存在着优化的思路但是自己不会就下机了。赛后看了题解发现就是多了个剪枝而已

假设我们至多可以交换 mmm 次,那么最多会影响到 2∗m2*m2∗m 个环,也就是说初始时就需要有 n−2∗mn-2*mn−2∗m 个自环才行。设 cnt[k]cnt[k]cnt[k] 是偏移量为 kkk 时的自环个数,不难看出 ∑cnt[i]=n\sum cnt[i]=n∑cnt[i]=n。又因为 m≤n3m\le \frac{n}{3}m≤3n​,所以 cnt[k]≥n−2∗mcnt[k]\ge n-2*mcnt[k]≥n−2∗m 即 cnt[k]≥n3cnt[k]\ge \frac{n}{3}cnt[k]≥3n​,所以这样的 kkk 最多有 333 个

剩下的暴力就可以了

代码:

// Problem: E. Permutation Shift
// Contest: Codeforces - Harbour.Space Scholarship Contest 2021-2022 (open for everyone, rated, Div. 1 + Div. 2)
// URL: https://codeforces.com/contest/1553/problem/E
// Memory Limit: 256 MB
// Time Limit: 3000 ms
//
// Powered by CP Editor (https://cpeditor.org)// #pragma GCC optimize(2)
// #pragma GCC optimize("Ofast","inline","-ffast-math")
// #pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
#include<list>
#include<unordered_map>
#define lowbit(x) (x&-x)
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
template<typename T>
inline void read(T &x)
{T f=1;x=0;char ch=getchar();while(0==isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(0!=isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();x*=f;
}
template<typename T>
inline void write(T x)
{if(x<0){x=~(x-1);putchar('-');}if(x>9)write(x/10);putchar(x%10+'0');
}
const int inf=0x3f3f3f3f;
const int N=1e6+100;
int p[N],a[N],cnt[N],n,m;
bool vis[N];
bool check(int k) {int tot=0;for(int i=k+1;i<=n;i++) {p[++tot]=a[i];}for(int i=1;i<=k;i++) {p[++tot]=a[i];}int ans=n;memset(vis,false,n+5);for(int i=1;i<=n;i++) {if(vis[i]) {continue;}ans--;int pos=i;while(!vis[pos]) {vis[pos]=true;pos=p[pos];}}return ans<=m;
}
int main()
{#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);int w;cin>>w;while(w--) {read(n),read(m);memset(cnt,0,sizeof(int)*(n+5));for(int i=1;i<=n;i++) {read(a[i]);cnt[(i-a[i]+n)%n]++;}vector<int>ans;for(int i=0;i<n;i++) {if(cnt[i]>=n-2*m&&check(i)) {ans.push_back(i);}}printf("%d",(int)ans.size());for(auto it:ans) {printf(" %d",it);}puts("");}return 0;
}

CodeForces - 1553E Permutation Shift(暴力+置换群求环)相关推荐

  1. codeforces 7.22 E Permutation Shift

    codeforces 7.22 E Permutation Shift 给出一个1到n的排列,每次可以交换两个数,问在交换最多m次(m <= n/3)之后能不能得到由1 2 3 - n循环右移所 ...

  2. 图论 ---- Codeforces Round #649 (Div. 2)D题[dfs求环+深度分层求图中独立集]

    D. Ehab's Last Corollary 题目大意: 就是给你一个联通图,你有两种选择 1.你可以输出包含⌈k2⌉\lceil{k\over2}\rceil⌈2k​⌉个顶点得独立点集,什么是独 ...

  3. cf1553E. Permutation Shift

    cf1553E. Permutation Shift 题意: 给出一个1到n的排列,每次可以交换两个数,问在交换最多m次(m <= n/3)之后能不能得到由1 2 3 - n循环右移所得到的的排 ...

  4. Harbour.Space Scholarship Contest 2021-2022 E. Permutation Shift 思维 + 剪枝

    传送门 文章目录 题意: 思路: 题意: 给你一个初始排列[1,2,3,...,n][1,2,3,...,n][1,2,3,...,n],你可以选择一个kkk,将这个排列循环右移kkk次,让后最多交换 ...

  5. poj 2240 Bellman-Flod 求环

    http://poj.org/problem?id=2240 深刻体现了自己代码能力有问题外加改模板能力有问题.外加Debug有问题.以后做到: 1.算法原理能够轻易弄出来. 2.代码模板自己收集各种 ...

  6. 判断是否有环以及求环的入口节点。

    目录 思路一. 环形链表求环入口节点 一.判断是否有环 1.当节点个数为偶数个,slow走到中间节点,如果fast为空,则没有环. 2.当节点个数为奇数个,slow走到中间节点,如果fast-> ...

  7. Codeforces Gym 100342J Problem J. Triatrip 求三元环的数量 bitset

    Problem J. Triatrip Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100342/at ...

  8. codeforces数学1600day6[CodeForces - 1029C多区间交+枚举,CodeForces 992C[数学公式推导],CodeForces 992B[质因数分解+暴力枚举]]

    A - Maximal Intersection CodeForces - 1029C 题目大意:就是给你n个区间,这n个区间有公共的区间长度为x,现在叫你从这n个区间中删掉一个使得x最大化. 解题思 ...

  9. Last Theorem CodeForces - 1325F(dfs树找最大环+思维)

    It's the year 5555. You have a graph, and you want to find a long cycle and a huge independent set, ...

最新文章

  1. Redis 主库宕机如何快速恢复?面试必问!
  2. 为什么深度学习几乎成了计算机视觉研究的标配?
  3. 混合多云架构_混合多云每个人都应避免的3个陷阱(第1部分)
  4. android实现跳转支付宝微信支付,Android接入支付宝和微信支付的方法
  5. (七)HyperledgerFarbic1.4- Fabric的SDK使用
  6. 解决 device is busy 的问题
  7. Kepware通过网络配置三菱FX5U型号PLC的方法
  8. django 常用static\media\邮箱\富文本编辑器配置(备忘)
  9. 杰理之使用MIC隔电容方案,微信语音前几秒也出现“哒哒”【篇】
  10. Flask框架学习笔记(1)
  11. 张丽俊最新演讲:要像竹子一样扎根,你终会一飞冲天
  12. Qt5.14.2使用虚拟键盘
  13. 登录界面及其功能的设计
  14. C# vs Java:北乔峰 vs 南慕容
  15. 《C++面试宝典》V1.0 冲刺大厂~持续更新(12)
  16. Linux的系统架构(linux由哪几部分组成?)
  17. 疯狂Java讲义(六)----第二部分
  18. idea栏目字体过大,不能恢复,影响设置的解决方法
  19. 卡、千卡、大卡、卡路里、千焦是什么关系?
  20. 科研实习 | 清华大学交叉信息研究院弋力老师课题组招收科研实习生

热门文章

  1. 偷懒大法好,用 selenium 做 web 端自动化测试
  2. SpringBoot 实战:如何从零开发 “淘宝”
  3. 教你11 周打造全能Python工程师!
  4. docker 不包含依赖 打包_Docker容器技术(概念篇)
  5. Nginx配置文件nginx.conf的文件结构
  6. Nginx服务的信号控制之USR2
  7. 定时任务 - 定时关闭超期未支付订单
  8. Java的Excel导出方案介绍
  9. SpringMVC拦截器-快速入门(应用)
  10. BufferedOutputStream_字节缓冲输出流