【结论】判断一个有序序列能否通过两轮相同的交换操作得到给出的序列
来源:互联网 发布:java web不用tomcat 编辑:程序博客网 时间:2024/06/16 01:44
题目:判断一个有序序列能否通过两轮相同的交换操作得到给出的序列
结论:偶数、等数量、的连通块的数目均为偶数时可以。
#include<cstdio>#include<iostream>using namespace std;const int need=1003;//.........................................inline void in_(int &d){ char t=getchar(); while(t<'0'||t>'9') t=getchar(); for(d=0;!(t<'0'||t>'9');t=getchar()) d=(d<<1)+(d<<3)+t-'0';}//.........................................int be[need];int cnt_dian[need],cnt_huan[need];int gb(int x){ return be[x]==x? x: be[x]=gb(be[x]);} //.........................................int main(){ int T,n;in_(T);while(T--){ in_(n); for(int i=1;i<=n;i++) be[i]=i,cnt_dian[i]=cnt_huan[i]=0; for(int i=1,a,x,y;i<=n;i++) { in_(a); x=gb(a),y=gb(i); if(x!=y) be[x]=y; } int numhuan=0; for(int i=1,tmp;i<=n;i++) { tmp=gb(i); numhuan=max(numhuan,tmp); cnt_dian[tmp]++; } for(int i=1;i<=numhuan;i++) { if((cnt_dian[i]&1)==0) cnt_huan[cnt_dian[i]]++; } bool gans=true; for(int i=1;i<=n;i++) { if((cnt_huan[i]&1)==1) { puts("Impossible"); gans=false; break; } } if(gans) puts("Maybe");} }
0 0
- 【结论】判断一个有序序列能否通过两轮相同的交换操作得到给出的序列
- 使序列有序的最少交换次数
- 使序列有序的最少交换次数
- 使序列有序的最少交换次数
- 给出一个入栈序列和一个出栈序列,判断出栈序列是否是入栈序列对应的出栈序列
- 若干有序序列,合并成一个新的有序序列
- 判断一个序列是否为另一个序列的子序列(两种算法)
- 通过一个序列得到一颗树
- 判断给出的序列是不是一个二叉搜索树的后序遍历
- 两两交换(相邻)得到一个有序排列
- 使序列变为有序的最少交换次数
- 使序列有序的最少交换次数(minimum swaps)
- 使序列有序的最少交换次数(minimum swaps)
- 判断一个序列 是不栈的输出判断一个序列
- 【笔试】得到一个序列的全排列
- JZOJ5272. 神奇的重复序列 结论
- 给定栈的输入序列和输出序列,编程实现给出push和pop的操作序列
- 两个有序序列的中位数
- 电商商品规格选择逻辑
- OJ_0046
- 学Android--运用SQLite和ListView完成电话簿
- Android SnackBar使用方法
- Zipkin分布式任务追踪
- 【结论】判断一个有序序列能否通过两轮相同的交换操作得到给出的序列
- 踩坑系列-20161113-php上imap安装哪有那么麻烦(我讨厌装各种插件!!)
- 如何阅读Java源码 阅读java的真实体会
- poj2840 Big Clock
- Java 实现二分查找\折半查找
- 【问题收录】Eclipse the import java.awt cannot be resolve 问题解决
- Activity的探究
- Android Context 上下文 你必须知道的一切
- <img src=# onerror=alert(1)>