codeforces 251B Playing with Permutations 模拟

View Code
#include<cstdio>
#include<cstring>
int q[103], p[103], s[103], pp[103];
int n, k, a, b;
int main()
{
    int i, j;
    scanf("%d%d", &n, &k);
    for(i = 1; i <= n; i++)
        scanf("%d", &q[i]);
    for(i = 1; i <= n; i++)
        scanf("%d", &s[i]);
    //求解操作1的周期
    for(i = 1; i <= n; i++)
        pp[i] = p[i] = i;
    while(a <= k)
    {
        for(j = 1; j <= n && p[j] == s[j]; j++);
        if(j == n+1) break;      
        for(j = 1; j <= n; j++)
            pp[j] = p[q[j]];
        for(j = 1; j <= n; j++)
            p[j] = pp[j];
        a++;
    }
    //求解操作2的周期
    for(i = 1; i <= n; i++)
        pp[i] = p[i] = i;
    while(b <= k)
    {
        for(j = 1; j <= n && p[j] == s[j]; j++);
            if(j == n+1) break;
        for(j = 1; j <= n; j++)
            pp[q[j]] = p[j];
        for(j = 1; j <= n; j++)
            p[j] = pp[j];
        b++;
    }
    //对两边周期都为1进行特判
    if(a == 1 && b == 1 && k == 1) puts("YES");  
    else if(a == 1 && b == 1) puts("NO"); 

    else if(a == k+1 && b == k+1) puts("NO");   // 两边都走不到
    else if(!a && !b) puts("NO");               //一开始的串就是目标(a == 0 && b == 0)
        
    else if(((b+k+1)&1) || ((a+k+1)&1)) puts("YES"); //左右只要有一边可以到达
    else puts("NO");
    return 0;
}

/*
4 3
2 1 4 3
4 3 1 2
*/

 

posted @ 2012-12-07 19:59  To be an ACMan  Views(309)  Comments(0)    收藏  举报