[CSP-J 2025] 座位题解
P14358 [CSP-J 2025] 座位 / seat(民间数据)
题目描述
CSP-J 2025 第二轮正在进行。小 R 所在的考场共有 n×mn \times mn×m 名考生,其中所有考生的 CSP-J 2025 第一轮成绩互不相同。所有 n×mn \times mn×m 名考生将按照 CSP-J 2025 第一轮的成绩,由高到低蛇形分配座位,排列成 nnn 行 mmm 列。具体地,设小 R 所在的考场的所有考生的成绩从高到低分别为 s1>s2>⋯>sn×ms_1 > s_2 > \dots > s_{n \times m}s1>s2>⋯>sn×m,则成绩为 s1s_1s1 的考生的座位为第 1 列第 111 行,成绩为 s2s_2s2 的考生的座位为第 111 列第 222 行,…\dots…,成绩为 sns_nsn 的考生的座位为第 111 列第 nnn 行,成绩为 sn+1s_{n+1}sn+1 的考生的座位为第 222 列第 nnn 行,…\dots…,成绩为 s2ns_{2n}s2n 的考生的座位为第 222 列第 111 行,成绩为 s2n+1s_{2n+1}s2n+1 的考生的座位为第 333 列第 111 行,以此类推。
例如,若 n=4,m=5n = 4, m = 5n=4,m=5,则所有 4×5=204 \times 5 = 204×5=20 名考生将按照 CSP-J 2025 第一轮成绩从高到低的顺序,根据下图中的箭头顺序分配座位。
:::align{center}

:::
给定小 R 所在的考场座位的行数 nnn 与列数 mmm,以及小 R 所在的考场的所有考生 CSP-J 2025 第一轮的成绩 a1,a2,…,an×ma_1, a_2, \dots, a_{n \times m}a1,a2,…,an×m,其中 a1a_1a1 为小 R CSP-J 2025 第一轮的成绩,你需要帮助小 R 求出,他的座位为第几列第几行。
输入格式
输入的第一行包含两个正整数 n,mn, mn,m,分别表示小 R 所在的考场座位的行数与列数。
输入的第二行包含 n×mn \times mn×m 个正整数 a1,a2,…,an×ma_1, a_2, \dots, a_{n \times m}a1,a2,…,an×m,分别表示小 R 所在的考场的所有考生 CSP-J 2025 第一轮的成绩,其中 a1a_1a1 为小 R CSP-J 2025 第一轮的成绩。
输出格式
输出一行两个正整数 c,rc, rc,r,表示小 R 的座位为第 ccc 列第 rrr 行。
输入输出样例 #1
输入 #1
2 2
99 100 97 98
输出 #1
1 2
输入输出样例 #2
输入 #2
2 2
98 99 100 97
输出 #2
2 2
输入输出样例 #3
输入 #3
3 3
94 95 96 97 98 99 100 93 92
输出 #3
3 1
说明/提示
【样例 1 解释】
按照成绩从高到低的顺序,成绩为 100100100 的考生的座位为第 111 列第 111 行,成绩为 999999 的考生的座位为第 111 列第 222 行,成绩为 989898 的考生的座位为第 222 列第 222 行,成绩为 979797 的考生的座位为第 222 列第 111 行。小 R 的成绩为 999999,因此座位为第 111 列第 222 行。
【样例 2 解释】
按照成绩从高到低的顺序,成绩为 100100100 的考生的座位为第 111 列第 111 行,成绩为 999999 的考生的座位为第 111 列第 222 行,成绩为 989898 的考生的座位为第 222 列第 222 行,成绩为 979797 的考生的座位为第 222 列第 111 行。小 R 的成绩为 989898,因此座位为第 222 列第 222 行。
【数据范围】
对于所有测试数据,保证:
- 1≤n≤101 \leq n \leq 101≤n≤10, 1≤m≤101 \leq m \leq 101≤m≤10;
- 对于所有 1≤i≤n×m1 \leq i \leq n \times m1≤i≤n×m,均有 1≤ai≤1001 \leq a_i \leq 1001≤ai≤100,且 a1,a2,…,an×ma_1, a_2, \dots, a_{n \times m}a1,a2,…,an×m 互不相同。
::cute-table{tuack}
| 测试点编号 | n≤n \leqn≤ | m≤m \leqm≤ | 特殊性质 |
|---|---|---|---|
| 111 | 111 | 111 | AB |
| 2,32, 32,3 | ^ | 101010 | 无 |
| 4,54, 54,5 | 101010 | 111 | ^ |
| 666 | 222 | 222 | A |
| 777 | ^ | ^ | B |
| 8,98, 98,9 | ^ | ^ | 无 |
| 101010 | ^ | 101010 | A |
| 111111 | ^ | ^ | B |
| 12∼1412 \sim 1412∼14 | ^ | ^ | 无 |
| 15∼1715 \sim 1715∼17 | 101010 | 222 | ^ |
| 18∼2018 \sim 2018∼20 | ^ | 101010 | ^ |
特殊性质 A:对于所有 1≤i≤n×m1 \leq i \leq n \times m1≤i≤n×m,均有 ai=ia_i = iai=i。
特殊性质 B:对于所有 1≤i≤n×m1 \leq i \leq n \times m1≤i≤n×m,均有 ai=n×m−i+1a_i = n \times m - i + 1ai=n×m−i+1。
思路
直接模拟放置,标记一下1点,扫到直接输出即可。
代码见下
#include<bits/stdc++.h>
using namespace std;
long long n,m,d[105][105];
struct one{
long long a,b;
}a[100005];
bool cmp(one a1,one b1){
return a1.a>b1.a;
}
int main(){
cin>>n>>m;
cin>>a[1].a;
a[1].b=1;
for(int i=2;i<=n*m;i++){
cin>>a[i].a;
a[i].b=0;
}
sort(a+1,a+n*m+1,cmp);
for(int i=1;i<=m;i++){
if(i%2==1){
for(int j=1;j<=n;j++){
d[i][j]=a[(i-1)*n+j].b;
}
}
else{
for(int j=1;j<=n;j++){
d[i][j]=a[(i-1)*n+n-j+1].b;
}
}
}
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(d[i][j]==1){
cout<<i<<" "<<j<<endl;
return 0;
}
}
}
return 0;
}

浙公网安备 33010602011771号