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\n",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("\n");
}
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("\n");
    }

    return 0;
}
View Code

 

posted @ 2018-03-16 19:20  _Jessie  阅读(200)  评论(0编辑  收藏  举报