牛线Cow Line

题目背景

征求翻译。如果你能提供翻译或者题意简述,请直接发讨论,感谢你的贡献。

题目描述

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.

N(1<=N<=20)头牛,编号为1...N,正在与FJ玩一个疯狂的游戏。奶牛会排成一行(牛线),问FJ此时的行号是多少。之后,FJ会给牛一个行号,牛必须按照新行号排列成线。

行号是通过以字典序对行的所有排列进行编号来分配的。比如说:FJ有5头牛,让他们排为行号3,排列顺序为:

1:1 2 3 4 5

2:1 2 3 5 4

3:1 2 4 3 5

因此,牛将在牛线1 2 4 3 5中。

之后,奶牛排列为“1 2 5 3 4”,并向FJ问他们的行号。继续列表:

4:1 2 4 5 3

5:1 2 5 3 4

FJ可以看到这里的答案是5。

FJ和奶牛希望你的帮助玩他们的游戏。他们需要K(1<=K<=10000)组查询,查询有两个部分:C_i将是“P”或“Q”的命令。

如果C_i是‘P‘,则查询的第二部分将是一个整数A_i(1 <= A_i <= N!),它是行号。此时,你需要回答正确的牛线。

如果C_i是“Q”,则查询的第二部分将是N个不同的整数B_ij(1 <= B_ij <= N)。这将表示一条牛线,此时你需要输出正确的行号。

输入格式

* 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

说明/提示

感谢@prcups 提供翻译

这题题目中给了一个比较重要的信息

"很明显,问题的答案与奶牛进入谷仓的顺序无关。"

这句话告诉了我们这题的一个思路:将所有数据一起处理

我们可以先假设所有牛棚可以放无数个奶牛

然后一个一个往后推

这样得出的答案就是直接做的答案(当然牛棚和牛具体对应的序号是不知道的)

要注意可能爆int,以及第一遍扫过以后可能有的到了头一个牛棚,要再来一遍

#include<cstdio>
using namespace std;

long long int n,k,i,j,ans[3000005],x,y,a,b;

inline long long int read(){
    long long int s=0,w=1;
    char ch=getchar();
    while(ch<‘0‘||ch>‘9‘){
        if(ch==‘-‘){
            w=-1;
        }
        ch=getchar();
    }
    while(ch>=‘0‘&&ch<=‘9‘){
        s=s*10+ch-‘0‘;
        ch=getchar();
    }
    return s*w;
}

int main(){
    n=read();
    k=read();
    while(k--){
        x=read();
        y=read();
        a=read();
        b=read();
        for(int i=1;i<=y;i++){
            ans[(a*i+b)%n]+=x;
        }
    }
    for(int i=0;i<n;i++){
        if(ans[i]>0){
            ans[(i+1)%n]+=ans[i]-1;
            ans[i]=1;
        }
    }
    while(ans[0]>1)
        for(int i=0;i<n;i++){
            if(ans[i]>0){
                ans[(i+1)%n]+=ans[i]-1;
                ans[i]=1;
            }
        }
    for(int i=0;i<n;i++){
        if(ans[i]==0){
            printf("%lld\n",i);
            return 0;
        }
    }
    return 0;
}

原文地址:https://www.cnblogs.com/hrj1/p/11223359.html

时间: 2024-10-03 15:48:18

牛线Cow Line的相关文章

洛谷 P3014 [USACO11FEB]牛线Cow Line

P3014 [USACO11FEB]牛线Cow Line 题目背景 征求翻译.如果你能提供翻译或者题意简述,请直接发讨论,感谢你的贡献. 题目描述 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 Far

P2952 [USACO09OPEN]牛线Cow Line

题目描述 Farmer John's N cows (conveniently numbered 1..N) are forming a line. The line begins with no cows and then, as time progresses, one by one, the cows join the line on the left or right side. Every once in a while, some number of cows on the left

洛谷P3014 [USACO11FEB]牛线Cow Line

---恢复内容开始--- 关于康托展开 与 康托逆展开 1 #include <bits/stdc++.h> 2 #define For(i, j, k) for(int i=j; i<=k; i++) 3 #define Dow(i, j, k) for(int i=j; i>=k; i--) 4 #define LL long long 5 using namespace std; 6 inline LL read() { 7 LL x = 0, f = 1; 8 char c

贪心 洛谷P2870 [USACO07DEC]最佳牛线,黄金Best Cow Line, Gold

[USACO07DEC]最佳牛线,黄金Best Cow Line, Gold 题目描述 FJ is about to take his N (1 ≤ N ≤ 30,000) cows to the annual"Farmer of the Year" competition. In this contest every farmer arranges his cows in a line and herds them past the judges. The contest organ

编程算法 - 最好牛线(Best Cow Line) 代码(C)

最好牛线(Best Cow Line) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 给定长度为N的字符串S, 要构造一个长度为N的字符串T. 反复进行如下任意操作. 从S的头部删除一个字符, 放入T的尾部; 从S的尾部删除一个字符, 放入T的尾部; 目标是要构造字典序尽可能小的字符串T. 使用贪心算法, 不断选取S首尾最小的字符, 放入T, 如果相等, 则再次向内查找, 找到内部最小的. 代码: /* * main.cpp * * Cr

P2870 [USACO07DEC]最佳牛线,黄金Best Cow Line, Gold 解题报告

P2870 [USACO07DEC]最佳牛线,黄金Best Cow Line, Gold 题意 给一个字符串,每次可以从两边中的一边取一个字符,要求取出的字符串字典序最小 可以Hash+二分 也可以SA 首先贪心选字典序小的 然后遇到相等的了比Rank数组,把原串倍长一下就可以比了. Code: #include <cstdio> #include <algorithm> const int N=6e4+10; char s[N],ans[N]; int sa[N],Rank[N]

[Luogu2870] [USACO07DEC]最佳牛线Best Cow Line(贪心+后缀数组)

[Luogu2870] [USACO07DEC]最佳牛线Best Cow Line(贪心+后缀数组) 题面 FJ打算带他的\(N(1 \leq N \leq 30,000)\)头奶牛去参加一年一度的"全美农场主大奖赛".在这场比赛中,每个参赛者都必须让他的奶牛排成一列,然后领她们从裁判席前依次走过. 今年,竞赛委员会在接受队伍报名时,采用了一种新的登记规则:他们把所有队伍中奶牛名字的首字母取出,按它们对应奶牛在队伍中的次序排成一列(比如说,如果FJ带去的奶牛依次为Bessie.Sylv

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

BZOJ 3403: [Usaco2009 Open]Cow Line 直线上的牛( deque )

直接用STL的的deque就好了... ---------------------------------------------------------------------- #include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #include<deque> #define rep( i , n ) for( int i = 0 ; i <