Cow Line(洛谷-P3014)
題目描述
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 number is. In return, Farmer John can give them a line number and the cows must rearrange themselves into that line.
A line number is assigned by numbering all the permutations of the line in lexicographic order.
Consider this example:
Farmer John has 5 cows and gives them the line number of 3.
The permutations of the line in ascending lexicographic order: 1st: 1 2 3 4 5
2nd: 1 2 3 5 4
3rd: 1 2 4 3 5
Therefore, the cows will line themselves in the cow line 1 2 4 3 5.
The cows, in return, line themselves in the configuration '1 2 5 3 4' and ask Farmer John what their line number is.
Continuing with the list:
4th : 1 2 4 5 3
5th : 1 2 5 3 4
Farmer John can see the answer here is 5
Farmer John and the cows would like your help to play their game. They have K (1 <= K <= 10,000) queries that they need help with. Query i has two parts: C_i will be the command, which is either 'P' or 'Q'.
If C_i is 'P', then the second part of the query will be one integer A_i (1 <= A_i <= N!), which is a line number. This is Farmer John challenging the cows to line up in the correct cow line.
If C_i is 'Q', then the second part of the query will be N distinct integers B_ij (1 <= B_ij <= N). This will denote a cow line. These are the cows challenging Farmer John to find their line number.
輸入輸出格式
輸入格式:
* Line 1: Two space-separated integers: N and K
* Lines 2..2*K+1: Line 2*i and 2*i+1 will contain a single query.
Line 2*i will contain just one character: 'Q' if the cows are lining up and asking Farmer John for their line number or 'P' if Farmer John gives the cows a line number.
If the line 2*i is 'Q', then line 2*i+1 will contain N space-separated integers B_ij which represent the cow line. If the line 2*i is 'P', then line 2*i+1 will contain a single integer A_i which is the line number to solve for.
輸出格式:
* Lines 1..K: Line i will contain the answer to query i.
If line 2*i of the input was 'Q', then this line will contain a single integer, which is the line number of the cow line in line 2*i+1.
If line 2*i of the input was 'P', then this line will contain N space separated integers giving the cow line of the number in line 2*i+1.
輸入輸出樣例
輸入樣例#1:
5 2?
P?
3?
Q?
1 2 5 3 4?
輸出樣例#1:
1 2 4 3 5?
5?
題意:n 頭牛編號從 1~n 排成一行,行號按照字典序分配,有 k 組查詢,P x 代表詢問行號為 x 的序列,Q a1 a2 ... an 代表詢問在 a1 a2 ... an 排列下的行號
思路:可以發現,P 查詢是詢問 1~n 的逆康托展開,Q 詢問是詢問 1~n 的康托展開,套用模版即可,需要注意的是由于 n 最大到 20,要用?long long
源代碼
#include<iostream> #include<cstdio> #include<cstdlib> #include<string> #include<cstring> #include<cmath> #include<ctime> #include<algorithm> #include<utility> #include<stack> #include<queue> #include<vector> #include<set> #include<map> #include<bitset> #define EPS 1e-9 #define PI acos(-1.0) #define INF 0x3f3f3f3f #define LL long long #define Pair pair<int,int> const int MOD = 1E9+7; const int N = 1000+5; const int dx[] = {-1,1,0,0,-1,-1,1,1}; const int dy[] = {0,0,-1,1,-1,1,-1,1}; using namespace std;LL a[N]; LL fac[N]; bool vis[N]; void getFactor(LL n) { //計算階乘fac[0]=1;for(int i=1; i<=n; i++)fac[i]=fac[i-1]*i; } LL contor(LL n) { //康托展開LL X=0;for(int i=1;i<n;i++){LL cnt=0;for(int j=i+1;j<=n;j++)if(a[j]<a[i])cnt++;X+=cnt*fac[n-i];}return X+1; } vector<LL> revContor(LL n, LL X) {//逆康托展開memset(vis,false,sizeof(vis));vector<LL> res(n,-1);X--;LL residue=X;//除數for (int i=0; i<=n-1; i++) {LL cnt=residue/(fac[n-i-1]);residue=residue%(fac[n-i-1]);for(int j=1;j<=n;j++) {if (!vis[j]) {if(!cnt){vis[j]=true;res[i]=j;break;}cnt--;}}}return res; } int main() {LL n;scanf("%lld",&n);getFactor(n);LL k;scanf("%lld",&k);while(k--){getchar();char ch;scanf("%c",&ch);if(ch=='P'){LL num;scanf("%lld",&num);vector<LL> res=revContor(n,num);for(int i=0;i<res.size();i++)printf("%lld ",res[i]);printf("\n");}else if(ch=='Q'){for(int i=1;i<=n;i++)scanf("%lld",&a[i]);LL res=contor(n);printf("%lld\n",res);}}return 0; }?
總結
以上是生活随笔為你收集整理的Cow Line(洛谷-P3014)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图论 —— DAG 图的最长路
- 下一篇: 信息学奥赛一本通(1042:奇偶ASCI