cf 251 B Playing with Permutations 暴力 分类讨论
题链;http://codeforces.com/problemset/problem/251/B
2 seconds
256 megabytes
standard input
standard output
Little Petya likes permutations a lot. Recently his mom has presented him permutation q1, q2, ..., qn of
length n.
A permutation a of length n is
a sequence of integers a1, a2, ..., an (1 ≤ ai ≤ n),
all integers there are distinct.
There is only one thing Petya likes more than permutations: playing with little Masha. As it turns out, Masha also has a permutation of length n.
Petya decided to get the same permutation, whatever the cost may be. For that, he devised a game with the following rules:
- Before the beginning of the game Petya writes permutation 1, 2, ..., n on the blackboard. After that Petya makes exactly k moves,
which are described below. - During a move Petya tosses a coin. If the coin shows heads, he performs point 1, if the coin shows tails, he performs point 2.
- Let's assume that the board contains permutation p1, p2, ..., pn at
the given moment. Then Petya removes the written permutation p from the board and writes another one instead: pq1, pq2, ..., pqn.
In other words, Petya applies permutation q(which he has got from his mother) to permutation p. - All actions are similar to point 1, except that Petya writes permutation t on the board, such that: tqi = pi for
all i from 1 to n.
In other words, Petya applies a permutation that is inverse to q to permutation p.
- Let's assume that the board contains permutation p1, p2, ..., pn at
We know that after the k-th move the board contained Masha's permutation s1, s2, ..., sn.
Besides, we know that throughout the game process Masha's permutation never occurred on the board before the k-th
move. Note that the game has exactly k moves, that is, throughout the game the coin was tossed exactly k times.
Your task is to determine whether the described situation is possible or else state that Petya was mistaken somewhere. See samples and notes to them for a better understanding.
The first line contains two integers n and k (1 ≤ n, k ≤ 100).
The second line contains n space-separated integers q1, q2, ..., qn(1 ≤ qi ≤ n)
— the permutation that Petya's got as a present. The third line contains Masha's permutation s, in the similar format.
It is guaranteed that the given sequences q and s are
correct permutations.
If the situation that is described in the statement is possible, print "YES" (without the quotes), otherwise print "NO"
(without the quotes).
4 1
2 3 4 1
1 2 3 4
NO
4 1
4 3 1 2
3 4 2 1
YES
4 3
4 3 1 2
3 4 2 1
YES
4 2
4 3 1 2
2 1 4 3
YES
4 1
4 3 1 2
2 1 4 3
NO
In the first sample Masha's permutation coincides with the permutation that was written on the board before the beginning of the game. Consequently, that violates the condition that Masha's permutation never occurred on the board before k moves
were performed.
In the second sample the described situation is possible, in case if after we toss a coin, we get tails.
In the third sample the possible coin tossing sequence is: heads-tails-tails.
In the fourth sample the possible coin tossing sequence is: heads-heads.
题意:感觉题目全然看不懂啊。。突然就冒出了个t。
题意是,给q数列,和s数列。然后p数列初始为1-n。然后通过p[q[i]]=p[i]。或者p[i]=p[q[i]]这两种变换,问有没有可能在k次变换后刚刚p数列为s数列。而且在这k次变换过程中。p数列不能等于s数列。p数列一開始就为s数列也不行。
做法:由于两个变换是相反的。所以能够通过两次分别两种变换来抵消。计算出p通过第一种变换要多少步能够达到s数列,然后另外一种变换要多少步。然后分类讨论。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <malloc.h>
#include <ctype.h>
#include <math.h>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
#include <stack>
#include <queue>
#include <vector>
#include <deque>
#include <set>
#include <map>
#define INF 999999999
#define eps 0.00001
#define LL __int64
#define pi acos(-1.0) int pp[1010],p[1010];
int q[1010],s[1010];
int main()
{
int n,k;
while(scanf("%d%d",&n,&k)!=EOF)
{
for(int i=1;i<=n;i++)
scanf("%d",&q[i]);
for(int i=1;i<=n;i++)
scanf("%d",&s[i]);
for(int i=1;i<=n;i++)
pp[i]=p[i]=i;
int flag;
int T1=0;
while(T1<=k)//tou
{
flag=1;
for(int i=1;i<=n;i++)
{
if(pp[i]!=s[i])
flag=0;
}
if(flag)
break;
for(int i=1;i<=n;i++)
pp[i]=p[q[i]];
for(int i=1;i<=n;i++)
p[i]=pp[i];
T1++;
}
for(int i=1;i<=n;i++)
pp[i]=p[i]=i;
int T2=0;
while(T2<=k)//tou
{
flag=1;
for(int i=1;i<=n;i++)
{
if(pp[i]!=s[i])
flag=0;
}
if(flag)
break;
for(int i=1;i<=n;i++)
pp[q[i]]=p[i];
for(int i=1;i<=n;i++)
p[i]=pp[i];
T2++;
} if(T1==0||T2==0)//一開始就一样
printf("NO\n");
else if(k==1&&(T1==1||T2==1))//一步一样
printf("YES\n");
else if(k!=1&&T1==1&&T2==1)
printf("NO\n");
else if(T1==k+1&&T2==k+1)
printf("NO\n");
else if((T1-k)%2==0&&T1<=k)
printf("YES\n");
else if((T2-k)%2==0&&T2<=k)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
/*
4 1
2 3 4 1
1 2 3 4 */
cf 251 B Playing with Permutations 暴力 分类讨论的更多相关文章
- 【cf789B】Masha and geometric depression(分类讨论/暴力)
B. Masha and geometric depression 题意 在黑板上写数列,首项是b,公比是q,超过l时就停止不写.给定m个数,遇到后跳过不写.问一共写多少个数,如果无穷个输出inf. ...
- CF 715 E. Complete the Permutations
CF 715 E. Complete the Permutations 题目大意:给定两个排列\(p,q\)的一部分.定义两个排列\(p,q\)的距离为使用最少的交换次数使得\(p_i=q_i\).对 ...
- UVaLive 6862 Triples (数学+分类讨论)
题意:给定一个n和m,问你x^j + y^j = z^j 的数量有多少个,其中0 <= x <= y <= z <= m, j = 2, 3, 4, ... n. 析:是一个数 ...
- CodeForces - 789B B. Masha and geometric depression---(水坑 分类讨论)
CodeForces - 789B 当时题意理解的有点偏差,一直wa在了14组.是q等于0的时候,b1的绝对值大于l的时候,当b1的绝对值大于l的时候就应该直接终端掉,不应该管后面的0的. 题意告诉你 ...
- P5979 [PA2014]Druzyny dp 分治 线段树 分类讨论 启发式合并
LINK:Druzyny 这题研究了一下午 终于搞懂了. \(n^2\)的dp很容易得到. 考虑优化.又有大于的限制又有小于的限制这个非常难处理. 不过可以得到在限制人数上界的情况下能转移到的最远端点 ...
- Codeforces 1461F - Mathematical Expression(分类讨论+找性质+dp)
现场 1 小时 44 分钟过掉此题,祭之 大力分类讨论. 如果 \(|s|=1\),那么显然所有位置都只能填上这个字符,因为你只能这么填. scanf("%d",&n);m ...
- Codeforces 521E - Cycling City(点双连通分量+分类讨论)
Codeforces 题面传送门 & 洛谷题面传送门 大家都是暴力找生成树然后跳路径,代码不到 50 行(暴论)的一说--好,那本蒟蒻决定提供一种代码 150 行,但复杂度也是线性的分类讨论做 ...
- Codeforces 460D Little Victor and Set --分类讨论+构造
题意:从区间[L,R]中选取不多于k个数,使这些数异或和尽量小,输出最小异或和以及选取的那些数. 解法:分类讨论. 设选取k个数. 1. k=4的时候如果区间长度>=4且L是偶数,那么可以构造四 ...
- BZOJ-1067 降雨量 线段树+分类讨论
这道B题,刚的不行,各种碎点及其容易忽略,受不鸟了直接 1067: [SCOI2007]降雨量 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 2859 ...
随机推荐
- 设计模式之原型模式(php实现)
github地址:https://github.com/ZQCard/design_pattern1.先了解什么是浅拷贝与深拷贝 //深拷贝:赋值时值完全复制,完全的copy,对其中一个作出改变,不会 ...
- leetcode 题解:Merge Sorted Array(两个已排序数组归并)
题目: Given two sorted integer arrays A and B, merge B into A as one sorted array. Note:You may assume ...
- 面试——String的比较总结
public class StringTest { private static String getA() {return "a";} public static void ma ...
- [转载]SecureCRT 绝佳配色方案, 保护你的眼睛
FROM:http://blog.csdn.net/zklth/article/details/8937905 SecureCRT 绝佳配色方案, 保护你的眼睛 关键词:SecureCRT配色, ...
- window命令
查看端口占用命令: 开始--运行--cmd 进入命令提示符 输入netstat -aon 即可看到所有连接的PID 之后在任务管理器中找到这个PID所对应的程序如果任务管理器中没有PID这一项,可以在 ...
- MPTCP 源码分析(一) MPTCP的三次握手
简述: MPTCP依然按照正常的TCP进行三次握手,只是在握手过程中增加了MPTCP特有的信息. 建立过程 三次握手过程如下图所示: 左边客户端发送的第一个SYN包携带有客户端 ...
- 【转载】json对象的使用
使用JSON 进行数据传输 一.选择的意义 在异步应用程序中发送和接收信息时,可以选择以纯文本和 XML 作为数据格式.为了更好的使用ajax, 我们将学习一种有用的数据格式 JavaScript O ...
- vue-router 运行机制 及 底层原理
1.测试页面 index.html <!DOCTYPE html> <html lang="en"> <head> <meta chars ...
- js中的string.format函数代码
String.prototype.format = function(args) { if (arguments.length > 0) { var result = this; if (arg ...
- eclipse debug调试java程序的九个技巧
九个技巧: 逻辑结构 条件debug 异常断点 单步过滤 跳到帧 Inspect expressions display 远程debug 最早开始用eclipse的debug的时候,只会F5 F6 F ...