• USACO 2011 February Silver Cow Line /// 康拓展开模板题 oj22713


    题目大意:

    输入n k,1-n的排列,k次操作

    操作P:输入一个m 输出第m个排列

    操作Q:输入一个排列 输出它是第几个排列

    Sample Input

    5 2
    P
    3
    Q
    1 2 5 3 4

    Sample Output

    1 2 4 3 5
    5

     
    康拓展开裸题 然而因为用了getchar(); 所以一直在超时
    康拓展开:http://www.cnblogs.com/dong008259/archive/2011/12/12/2283436.html
    #include <bits/stdc++.h>
    using namespace std;
    int n,a[25],b[25];
    long long int fac[25]={1,1,2,6,24,120,720,5040,40320,362880,3628800,
    39916800,479001600,6227020800,87178291200,1307674368000,20922789888000,
    355687428096000,6402373705728000,121645100408832000,2432902008176640000};
    void ops0()
    {
        long long sum=0;
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        for(int i=1;i<=n;i++)
        {
            int tem=0;
            for(int j=i+1;j<=n;j++)
                if(a[j]<a[i]) tem++;
            sum+=tem*fac[n-i];
        }
        printf("%lld
    ",sum+1);
    }
    void ops1()
    {
        long long m; scanf("%lld",&m); m--;
        for(int i=n-1;i>=0;i--)
        {
            int tem=m/fac[i];
            for(int j=0;j<=tem;j++)
                if(b[j]) tem++;
            if(i) printf("%d ",tem+1);
            else printf("%d",tem+1);
            b[tem]=1;
            m%=fac[i];
        }
        printf("
    ");
    }
    int main()
    {
        int k;
        while(~scanf("%d%d",&n,&k))
        {
            while(k--)
            {
                memset(b,0,sizeof(b));
                char ops; scanf(" %c",&ops);
                if(ops=='P') ops1();
                else ops0();
            }
            printf("
    ");
        }
    
        return 0;
    }
    View Code
  • 相关阅读:
    ioremap函数
    kmalloc、kzalloc和vmalloc
    C语言 snprintf函数
    C语言 memset函数
    消息队列
    mount -a
    linux系统查看服务状态和启动停止服务
    Java中创建对象的内存图
    Java中数组在内存中的图解
    socket编程(Java实现)
  • 原文地址:https://www.cnblogs.com/zquzjx/p/8584285.html
Copyright © 2020-2023  润新知