[USACO2011 Feb] Cow Line

原题链接https://www.lydsy.com/JudgeOnline/problem.php?id=3301

康拓展开和逆展开的模板题。

#include<iostream>
#include<cstring>
#include<cstdio>
#define maxn 21
using namespace std;
 
inline int read(){
    register int x(0),f(1); register char c(getchar());
    while(c<'0'||'9'<c){ if(c=='-') f=-1; c=getchar(); }
    while('0'<=c&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
    return x*f;
}
 
long long mul[maxn];
int n,m,num[maxn];
 
inline void recontor(long long rank){
    bool vis[maxn]={0};
    rank--;
    for(register int i=1;i<=n;i++){
        int t=rank/mul[n-i],j;
        for(j=1;j<=n;j++) if(!vis[j]){
            if(t<=0) break;
            t--;
        }
        printf("%d ",j),vis[j]=true;
        rank%=mul[n-i];
    }
    puts("");
}
inline long long contor(){
    long long ans=1;
    for(register int i=1;i<=n;i++){
        int tot=0;
        for(register int j=i+1;j<=n;j++) if(num[i]>num[j]){
            tot++;
        }
        ans+=tot*mul[n-i];
    }
    return ans;
}
 
int main(){
    n=read(),m=read();
 
    mul[0]=1;
    for(register int i=1;i<=n;i++) mul[i]=mul[i-1]*i;
 
    for(register int i=1;i<=m;i++){
        char op; cin>>op;
        if(op=='P'){
            long long rank; scanf("%lld",&rank);
            recontor(rank);
        }else{
            for(register int i=1;i<=n;i++) num[i]=read();
            printf("%lld
",contor());
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/akura/p/11309841.html