[CF1491G]Switch and Flip

2024-03-16 22:58
文章标签 switch flip cf1491g

本文主要是介绍[CF1491G]Switch and Flip,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Switch and Flip

题解

我们可以先将原序列转化成一张有向图,点 i i i ∣ a i ∣ \left |a_{i}\right | ai连边。

我们的每次操作相当于交换两个点的出边所连向的点,并在两点颜色相同时将它们的颜色全部翻转。

相当于有这样的操作:

image-20210522121645400

image-20210522121702163

转化后的图必然有许多的环,我们的任务是将所有的环都变成自环。

如果我们有两个以上的环,我们有这样的解决方案:

image-20210522122307940

将两个环连在一起,然后通过操作不断缩小环的大小,将所有的为翻转点都变成自环,最后就只有两个反转点连成的环,用一次操作将它解决的,这样的操作数是 O ( n ) O\left(n\right) O(n)的。

如果环数量最后不够,我们可以拿一个自环来代替,这样操作数是 O ( n + 1 ) O\left(n+1\right) O(n+1)的。

但如果总共只有 1 1 1个大小为 n n n的环呢?

  • 对于 n = 2 n=2 n=2的情况,直接翻一下就行了。

  • 对于 n = 3 n=3 n=3的情况我们可以手玩一下,操作数是 O ( 4 ) O(4) O(4)

  • 对于 n > 3 n>3 n>3的情况,我们可以先交换环上相邻的两个点,将其变成两个只有一个染色点的环。

    我们将其变成一个只有一个点染色的自环,一个有一个点染色一个点未染色的二元环。

    我们再交换这两个环上的点,将其转化成 n = 3 n=3 n=3的情况,照样处理即可。

    这样的操作数也是 O ( n + 1 ) O\left(n+1\right) O(n+1)的。

总时间复杂度 O ( n ) O\left(n\right) O(n),毕竟都是处理环的翻转嘛。

源码

void dosaka(int u){vis[u]=1;vec[idx].push_back(u);if(!vis[c[u]])dosaka(c[u]);}
void Swap(int u,int v){swap(c[u],c[v]);ans.push_back(mkpr(u,v));}
signed main(){read(n);for(int i=1;i<=n;i++)read(c[i]);for(int i=1;i<=n;i++)if(!vis[i]&&c[i]!=i)idx++,dosaka(i);for(int i=2;i<=idx;i+=2){int u=vec[i][0],v=vec[i-1][0];Swap(u,v);while(c[u]!=v)Swap(u,c[u]);while(c[v]!=u)Swap(v,c[v]);Swap(u,v);}if(idx&1){if(vec[idx].size()<n){for(int i=1;i<=n;i++){if(c[i]!=i)continue;int u=vec[idx][0];Swap(i,u);while(c[i]!=u){int las=c[i];Swap(i,c[i]);}Swap(u,i);break;}}if(vec[idx].size()==n){if(n==2)Swap(vec[idx][0],vec[idx][1]);if(n==3){Swap(vec[idx][0],vec[idx][1]);Swap(vec[idx][1],vec[idx][2]);Swap(vec[idx][0],vec[idx][2]);Swap(vec[idx][0],vec[idx][1]);}if(n>3){Swap(vec[idx][0],vec[idx][1]);while(c[c[vec[idx][0]]]!=vec[idx][0])Swap(vec[idx][0],c[vec[idx][0]]);Swap(c[vec[idx][0]],vec[idx][1]);Swap(vec[idx][0],c[vec[idx][0]]);Swap(vec[idx][0],vec[idx][1]);}}}printf("%d\n",ans.size());for(int i=0;i<ans.size();i++)printf("%d %d\n",ans[i].fir,ans[i].sec);return 0;
}

谢谢!!!

这篇关于[CF1491G]Switch and Flip的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/817001

相关文章

Java中switch-case结构的使用方法举例详解

《Java中switch-case结构的使用方法举例详解》:本文主要介绍Java中switch-case结构使用的相关资料,switch-case结构是Java中处理多个分支条件的一种有效方式,它... 目录前言一、switch-case结构的基本语法二、使用示例三、注意事项四、总结前言对于Java初学者

switch中的break控制

#include<iostream>using namespace std;int main(){int i=10;switch(i){case 9:i+=1;case 10:i+=1;case 11:i+=1;default:i+=1;}cout<<i<<endl;return 0;} 上面的结果是13; #include<iostream>using namespace s

王立平--switch case

@Override public void onClick(View v) {   switch (v.getId()) { 1. case R.id.btn_addPic: break; 2. case R.id.btn_reflectPic: break; default: break; } } 如果黑色字体的break你忘记了写。。。 那么程序就会从进入swit

Android Switch开关

Switch相关XML 属性 android:checked="true"android:thumb="@drawable/alert_dialog_icon" //开关android:track="@drawable/img1" //开关滑动轨道android:textStyle="bold"android:typeface="monospace"android:switchM

Python中 Switch/Case 实现

学习Python过程中,发现没有switch-case,过去写C习惯用Switch/Case语句,官方文档说通过if-elif实现。所以不妨自己来实现Switch/Case功能。 方法一 通过字典实现 def foo(var):return {'a': 1,'b': 2,'c': 3,}.get(var,'error') #'error'为默认返回值,可自设置 方法二 通过匿名函数

git switch和git checkout

git switch 和 git checkout 是 Git 版本控制系统中用于切换分支的命令,但它们之间有一些关键的区别和用途。在 Git 2.23 版本之前,git checkout 被用来切换分支、检出文件以及恢复工作树文件。然而,随着 Git 的发展,为了更清晰地表达命令的意图,Git 引入了 git switch 和 git restore 命令来分别处理分支切换和文件恢复的功能。

switch语句和while循环

switch语句和while循环 switch语句break的用法default的用法switch语句中的case和default的顺序问题 while语句while语句的执行流程while语句的具体例子 switch语句 switch 语句是⼀种特殊形式的 if…else 结构,用于判断条件有多个结果的情况。它把多重 的 else if 改成更易用、可读性更好的形式。 我们可

bpel 测试遇到“The content of the body cannot be displayed in the form view. Please switch to the source”

1.  出现“The content of thebody cannot be displayed in the form view. Please switch to the source view toexamine the raw content.”原因: 重新部署deploy.xml文件,重新放在tomcat/webapps/ode/processes文件夹下,重启tomcat。

【QNX+Android虚拟化方案】112 - 获取 88Q5152 Switch Port1、Port2 端口的主从模式 / 传输速率 / 链路状态

【QNX+Android虚拟化方案】112 - 获取 88Q5152 Switch Port1、Port2 端口的主从模式 / 传输速率 / 链路状态 1. 读取 P1、P2 端口 主从模式 / 传输速率2. 读取 P1、P2 端口 Link Status3. 读取 P1、P2 端口 Duplex 全双工/半双工模式4. 读取 P1、P2 链路信号SQI质量5. 完整代码如下

可以根据手机的折叠状态改变播放音效:nova Flip 的妙趣音效

由于折叠机最基础的“可折叠”属性,导致折叠机的扬声器相对于人的位置来说会存在更多的变化,在不同的折叠状态下,听感方面可能就会大有不同。 nova Flip手机利用这一特性,首次根据折叠形态差异,自适应了不同形态的音效氛围。 展开态:当手机是类似于直板机的展开态时,搭配首发的histen9.3音频算法,nova Flip拥有更具清晰度和更自然的音质效果,打造更具还原度的音效体验。   悬