bzoj3301: [USACO2011 Feb] Cow Line

新姿势康托展开。。

------------------------------------

裸的康托展开&逆康托展开

  康托展开就是一种特殊的hash,且是可逆的……

  康托展开计算的是有多少种排列的字典序比这个小,所以编号应该+1;逆运算同理(-1)。

  序列->序号:(康托展开)

    对于每个数a[i],数比它小的数有多少个在它之前没出现,记为b[i],ans=1+∑b[i]?(n?i)!ans=1+∑b[i]?(n?i)!

  序号->序列:(逆康托展开)

    求第x个排列所对应的序列,先将x-1,然后对于a[i],?x(n?i)!??x(n?i)!?即为在它之后出现的比它小的数的个数,所以从小到大数一下有几个没出现的数,就知道a[i]是第几个数了。

------------------------------------

 1 #include<bits/stdc++.h>
 2 #define rep(i,l,r) for(int i=l;i<=r;++i)
 3 using namespace std;
 4 const int N=25;
 5 int n,Q,a[N],f[N];
 6 typedef long long ll;
 7 char s[10];
 8 ll ans,sum,fac[N],x;
 9 int main(){
10     scanf("%d%d",&n,&Q);
11     fac[1]=1; fac[0]=1;
12     rep(i,2,n) fac[i]=fac[i-1]*i;
13     while(Q--){
14         scanf("%s",s);
15         if(s[0]==‘P‘){
16             scanf("%lld",&x);--x;
17             memset(f,0,sizeof f);
18               rep(i,1,n){
19                 int t=x/fac[n-i],j,k;
20                 for(k=1,j=0;j<=t;k++) if (!f[k]) j++;
21                    f[k-1]=1; a[i]=k-1;
22                   x%=fac[n-i];
23               }
24               rep(i,1,n-1) printf("%d ",a[i]);
25                printf("%d\n",a[n]);
26         }else {
27             memset(f,0,sizeof f); ans=1;
28             rep(i,1,n) {
29                 scanf("%lld",&x);
30                 f[x]=1;
31                 sum=0;
32                 rep(j,1,x-1) sum+=(!f[j]);
33                 ans+=sum*fac[n-i];
34             }
35             printf("%lld\n",ans);
36         }
37     }
38 }

时间: 2024-08-09 21:56:14

bzoj3301: [USACO2011 Feb] Cow Line的相关文章

3301: [USACO2011 Feb] Cow Line

3301: [USACO2011 Feb] Cow Line Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 82  Solved: 49[Submit][Status][Discuss] Description The N (1 <= N <= 20) cows conveniently numbered 1...N are playing yet another one of their crazy games with Farmer Joh

【BZOJ】【3301】【USACO2011 Feb】Cow Line

康托展开 裸的康托展开&逆康托展开 康托展开就是一种特殊的hash,且是可逆的…… 序列->序号:(康托展开) 对于每个数a[i],数比它小的数有多少个在它之前没出现,记为b[i],$ans=1+\sum b[i]* (n-i)!$ 序号->序列:(逆康托展开) 求第x个排列所对应的序列,先将x-1,然后对于a[i],$\left\floor \frac{x}{(n-i)!} \right\floor $即为在它之后出现的比它小的数的个数,所以从小到大数一下有几个没出现的数,就知道a[

BZOJ3300: [USACO2011 Feb]Best Parenthesis

3300: [USACO2011 Feb]Best Parenthesis Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 89  Solved: 42[Submit][Status] Description Recently, the cows have been competing with strings of balanced parentheses and comparing them with each other to see who

[USACO11FEB] Cow Line

https://www.luogu.org/problem/show?pid=3014 题目描述 The N (1 <= N <= 20) cows conveniently numbered 1...N are playing yet another one of their crazy games with Farmer John. The cows will arrange themselves in a line and ask Farmer John what their line

bzoj1640[Usaco2007 Nov]Best Cow Line 队列变换*&amp;&amp;bzoj1692[Usaco2007 Dec]队列变换*

bzoj1640[Usaco2007 Nov]Best Cow Line 队列变换 bzoj1692[Usaco2007 Dec]队列变换 题意: 有一个奶牛队列.每次可以在原来队列的首端或是尾端牵出一头奶牛,把她安排到新队列的尾部,然后对剩余的奶牛队列重复以上的操作,直到所有奶牛都被插到了新的队列里.这样得到的队列,就是FJ拉去登记的最终的奶牛队列. 求对于给定的奶牛们的初始位置,计算出可能得到的字典序最小的队列.队列大小≤30000. 题解: 有一个结论:如果当前队列中的队首元素不等于队尾元

3403: [Usaco2009 Open]Cow Line 直线上的牛

3403: [Usaco2009 Open]Cow Line 直线上的牛 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 71  Solved: 62[Submit][Status] Description 题目描述 约翰的N只奶牛(编为1到N号)正在直线上排队.直线上开始的时候一只牛也没有.接下来发生了S(1≤S≤100000)次事件,一次事件可能是以下四种情况之一: .一只奶牛加入队伍的左边(输入“AL”). .一只奶牛加入队伍的右边(输入“AR

1640: [Usaco2007 Nov]Best Cow Line 队列变换

1640: [Usaco2007 Nov]Best Cow Line 队列变换 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 543  Solved: 278[Submit][Status] Description FJ打算带着他可爱的N (1 ≤ N ≤ 2,000)头奶牛去参加”年度最佳老农”的比赛.在比赛中,每个农夫把他的奶牛排成一列,然后准备经过评委检验. 比赛中简单地将奶牛的名字缩写为其头字母(the initial letter of e

[BZOJ1697][Usaco2007 Feb]Cow Sorting牛排序

1697: [Usaco2007 Feb]Cow Sorting牛排序 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 712  Solved: 416 [Submit][Status][Discuss] Description 农夫JOHN准备把他的 N(1 <= N <= 10,000)头牛排队以便于行动.因为脾气大的牛有可能会捣乱,JOHN想把牛按脾气的大小排序.每一头牛的脾气都是一个在1到100,000之间的整数并且没有两头牛的脾气值相同.

[BZOJ] 1631: [Usaco2007 Feb]Cow Party

1631: [Usaco2007 Feb]Cow Party Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 866  Solved: 624[Submit][Status][Discuss] Description 农场有N(1≤N≤1000)个牛棚,每个牛棚都有1只奶牛要参加在X牛棚举行的奶牛派对.共有M(1≤M≤100000)条单向路连接着牛棚,第i条踣需要Ti的时间来通过.牛们都很懒,所以不管是前去X牛棚参加派对还是返回住所,她们都采用了用时最