problem

洛谷链接

solution

弱化版:如果不考虑翻面,那就是转化为若干个环的问题了。

这里我们尝试用同样的思路解决。

首先明确几个硬币一次交换后的等价情况,如图(灰色表示反面)

(u→vu\rightarrow vu→v 箭头的意思是硬币 uuu 的下标应该在硬币 vvv 所在位置)

case1 单独考虑每个环。初始零状态,随便选择一个硬币作切入点,破环。

大小为 xxx 的环,经过 x−1x-1x−1 次操作就可以变到其该在的位置,但是最后会有两个硬币是反面的。

显然,不可能两步就做到将硬币再翻面且位置正确。

假设是 (aˉ,bˉ,c)(\bar{a},\bar{b},c)(aˉ,bˉ,c) 这样情况的三枚硬币(括号强调顺序,三个硬币的位置都是对的,但 a,ba,ba,b 目前是反面朝上)。

(aˉ,bˉ,c)→(b,a,c)→(b,cˉ,aˉ)→(a,cˉ,bˉ)→(a,b,c)(\bar{a},\bar{b},c)\rightarrow (b,a,c)\rightarrow (b,\bar{c},\bar{a})\rightarrow (a,\bar{c},\bar{b})\rightarrow(a,b,c)(aˉ,bˉ,c)→(b,a,c)→(b,cˉ,aˉ)→(a,cˉ,bˉ)→(a,b,c),一共操作 444 次。符合要求。

由三元环的启示,我们不妨倒退一个状态,让三枚硬币都还未处于正确的状态(只要反面或位置不对都不算正确状态)。

则此时理应用了 x−2x-2x−2 次操作,状态应是一枚反面正确位置,一枚正面错误位置,一枚反面错误位置。

接着,(aˉ,c,bˉ)→(cˉ,a,bˉ)→(cˉ,b,aˉ)→(a,b,c)(\bar{a},c,\bar{b})\rightarrow (\bar{c},a,\bar{b})\rightarrow (\bar{c},b,\bar{a})\rightarrow (a,b,c)(aˉ,c,bˉ)→(cˉ,a,bˉ)→(cˉ,b,aˉ)→(a,b,c),只用三步即可。

这样就做到了一个 xxx 的环 x+1x+1x+1 次操作。

case2 但这仅仅是一个环,如果原题中有若干个环,额外次数却只有 111,还是不能通过。

事实上,单环的关键就在于每次有且仅有两枚反面朝上的硬币。

我们完全可以将两个环,任意交换一对硬币,从而是两环联通为一环。

这样花费是 111,同样直接进入单环问题的第一个状态(即初始有两个反面朝上的硬币)。

换言之,两个环 x1,x2x_1,x_2x1​,x2​,只用 x1+x2+1−1x_1+x_2+1-1x1​+x2​+1−1 步操作便可。

因此,可以两两环合并后再操作,就不会产生额外的 111。

如果有奇数个环,那么将最后一个环和第一个自环匹配一下,做个工具环即可。

这也是 m+1m+1m+1 的上限来源。

code

#include <bits/stdc++.h>
using namespace std;
#define maxn 200005
vector < pair < int, int > > ans;
int n, cnt;
int c[maxn], p[maxn];
bool vis[maxn];void Swap( int x, int y ) {swap( c[x], c[y] );ans.push_back( make_pair( x, y ) );
}void work( int x, int y ) {Swap( x, y );while( c[x] ^ y ) Swap( x, c[x] );while( c[y] ^ x ) Swap( y, c[y] );Swap( x, y );
}int main() {scanf( "%d", &n );for( int i = 1;i <= n;i ++ ) scanf( "%d", &c[i] );for( int i = 1;i <= n;i ++ )if( ! vis[i] ) {p[++ cnt] = i;for( int k = i;! vis[k];k = c[k] ) vis[k] = 1;}if( cnt == 1 ) {int x = p[1], y = c[x];Swap( x, y );while( c[c[x]] ^ x ) Swap( x, c[x] );int z = c[x];Swap( y, z );Swap( x, z );Swap( x, y );}else {for( int i = 1;i + 1 <= cnt;i += 2 ) work( p[i], p[i + 1] );if( cnt & 1 ) work( p[1], p[cnt] );}printf( "%d\n", ans.size() );for( int i = 0;i < ans.size();i ++ ) printf( "%d %d\n", ans[i].first, ans[i].second );return 0;
}

CodeForces 1491G Switch and Flip(结论)相关推荐

  1. HTML5 canvas处理图片的各种效果,包括放大缩小涂鸦等

    http://www.htmleaf.com/ziliaoku/qianduanjiaocheng/201502151385.html jQuery 缩放 旋转 裁剪图片 Image Cropper ...

  2. .Net Core功能开关实战

    为了快速发布开发完成的功能,企业通常会以比较快的迭代周期持续发布.但是由于某些 原因或场景,需要在发布的时候将某些功能隐藏起来或者小规模的开放(例如只有某些特定用户可以使用.或者特定日期开放),通过使 ...

  3. oracle表空间追加数据文件,oracle数据库表空间追加数据库文件方法

    mysql优化(初学) 写的时候遇到了SQL语句的优化问题,在网上搜了一些学习.http://blog.csdn.net/kennyrose/article/details/7532032 索引: 1 ...

  4. Codeforces 337D Book of Evil:树的直径【结论】

    题目链接:http://codeforces.com/problemset/problem/337/D 题意: 给你一棵树,n个节点. 如果一个节点处放着"罪恶之书",那么它会影响 ...

  5. Educational Codeforces Round 73 (Rated for Div. 2) Make The Fence Great Again dp + 结论

    传送门 文章目录 题意: 思路: 题意: 思路: 首先证明一个结论:一个数最多被加两次. 首先假设a[i]=a[i−1]a[i]=a[i-1]a[i]=a[i−1]或a[i]=a[i+1]a[i]=a ...

  6. 【Codeforces 1392F】Omkar and Landslide | 思维、结论

    题目链接:https://codeforces.ml/contest/1392/problem/F 题目大意: 给出N座山峰的高度h_i,之后重复进行下面的操作: 若存在一个位置i满足: 那么i高度就 ...

  7. Codeforces Round #658 (Div. 1) A2. Prefix Flip (Hard Version)

    Codeforces Round #658 (Div. 1) A2. Prefix Flip (Hard Version) 题目链接 There are two binary strings a an ...

  8. Codeforces Round #698 (Div. 2) D. Nezzar and Board(一步步推出来,超级清晰,不猜结论,看不懂来打我 ~ 好题 )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! D - Nezzar and Board Problem A Nezzar and Board 我们在黑板上写了 nnn 个数,x1,x2 ...

  9. jquery mobile页面切换效果(Flip toggle switch)(注:jQuery移动使用的数据属性的列表。 )...

    1.页面切换(data-transition) 地址:http://api.jquerymobile.com/data-attribute/ data-transition      fade | f ...

最新文章

  1. mysql日期时间函数
  2. 【区块链-以太坊】5 Ubuntu下truffle ganache安装及使用
  3. BOOST_TEST_TRAIT_SAME的用法实例
  4. python人脸实时检测_openCV+python实现人脸实时检测
  5. mysql 64位 安装1045_MySql 安装时的1045错误
  6. strtotime()加半个小时_椰子鸡这样做太好吃了,一滴水不用加,鲜香嫩滑,做法非常简单...
  7. 小强升职记思维导图_你学会用 “思维导图” 学英语了吗?
  8. CSS 渐进增强与优雅降级
  9. 登录验证---添加验证码验证,Cookie保存功能
  10. AI队列长度检测:使用YOLO进行图像中的对象检测
  11. free 和 fclose
  12. drozer 找不到java_自己安装drozer时出现各种问题的解决
  13. 关于百度有啊的几点看法
  14. ps扁平图之 油画(莫奈)中的色彩与几何
  15. flutter与RN对比
  16. 大数据毕设/课设 - 数据大屏监控可视化设计与实现
  17. vue后台管理系统实践方案总结(一)
  18. 博客系统视频_视频博客| 视频博客
  19. Yolov8的多目标跟踪实现
  20. 专项测试之Web测试

热门文章

  1. matlab浮点数求绝对值_MATLAB仿真阵列天线切比雪夫综合法(附代码)
  2. mybatis-plus 会自动增加 order by_python自动撸支付宝基金答题红包
  3. sql年月日24小时制_Power Query 抓取气象台24小时降水量数据
  4. 6计算机系统的组成是,计算机系统的组成(范文)(6页)-原创力文档
  5. 架构师讲解Java中websocket的应用
  6. vs code python 插件_工具篇-vscode效率提升插件
  7. python中summary_python summary_study.py
  8. python中list的意思_list在python中是什么意思
  9. C++ 学习之旅(13)——枚举enum
  10. html css图标怎么跟文字并排,html - FA图标和文字环绕的HTML / CSS问题 - SO中文参考 - www.soinside.com...