[语言月赛 202311] 表格处理
题目描述
小 A 有一张 2 × n 2\times n 2×n 行, 2 × m 2\times m 2×m 列的表格。表格上每一行、每一列都有一个正整数。他将对表格先进行一次合并操作,再进行一次转置操作。
对于一个 2 × n 2\times n 2×n 行, 2 × m 2\times m 2×m 列的表格 A A A,进行一次合并操作得到一个 n n n 行 m m m 列的表格 A ′ A' A′ 的流程为:
- 将奇数列的每个数加上其右侧相邻的数,之后删除所有的偶数列,给每一列重新编号为第 1 , 2 , 3 , … , m 1,2,3,\dots,m 1,2,3,…,m 列;
- 将奇数行的每个数加上其下侧相邻的数,之后删除所有的偶数行,给每一行重新编号为第 1 , 2 , 3 , … , n 1,2,3,\dots,n 1,2,3,…,n 行;
对于一个 n n n 行 m m m 列的表格 A A A,进行一次转置操作得到一个 m m m 行 n n n 列的表格 A T A^T AT 的流程为:
- 对于所有的 i , j i,j i,j,令 A i , j T = A j , i A^T_{i,j}=A_{j,i} Ai,jT=Aj,i;
小 A 想要知道经过这样两次操作后表格会是什么样的。请输出该表格。
本题的输入输出规模较大,特别是对使用 Java/Python 等非传统语言的选手,请使用相对快速的输入输出方式。
输入格式
第一行输入两个正整数 n n n 和 m m m。
第二行到第 2 × n + 1 2\times n+1 2×n+1 行,每行输入 2 × m 2\times m 2×m 个正整数,表示表格上每一行每一列的值。
输出格式
输出一个 m m m 行 n n n 列的表格,表示经过两次操作后表格会是什么样的。同一行内的正整数之间用空格隔开。
样例 #1
样例输入 #1
2 2
2 7 1 8
1 8 2 8
3 1 4 1
5 9 2 6
样例输出 #1
18 18
19 13
样例 #2
样例输入 #2
3 3
6 2 3 5 3 2
1 3 1 4 5 2
7 8 7 8 5 6
2 8 3 6 4 8
9 2 1 8 7 5
4 2 4 3 5 1
样例输出 #2
12 25 17
13 24 16
12 23 18
提示说明
【样例解释】
对于样例一给出的表格,其是经过这些变换得到的:
[ 2 7 1 8 1 8 2 8 3 1 4 1 5 9 2 6 ] 删除列 → [ 9 9 9 10 4 5 14 8 ] 删除行 → [ 18 19 18 13 ] 转置 → [ 18 18 19 13 ] \begin{bmatrix}2 & 7 & 1 & 8 \\ 1 & 8 & 2 & 8 \\ 3 & 1 & 4 & 1 \\ 5 & 9 & 2 & 6 \end{bmatrix} \underrightarrow{删除列} \begin{bmatrix} 9 & 9 \\ 9 & 10 \\4 & 5 \\ 14 & 8 \\\end{bmatrix} \underrightarrow{删除行} \begin{bmatrix} 18 & 19 \\ 18 & 13\end{bmatrix} \underrightarrow{转置} \begin{bmatrix} 18 & 18 \\19 & 13\end{bmatrix} 2135781912428816 删除列 9941491058 删除行[18181913]转置[18191813]
【数据范围】
对于所有数据,保证: 1 ≤ n , m ≤ 1000 1 \leq n,m \leq 1000 1≤n,m≤1000, 1 ≤ a i ≤ 1 0 6 1 \leq a_i \leq 10^6 1≤ai≤106。
代码内容
// #include <iostream>
// #include <algorithm>
// #include <cstring>
// #include <stack>//栈
// #include <deque>//队列
// #include <queue>//堆/优先队列
// #include <map>//映射
// #include <unordered_map>//哈希表
// #include <vector>//容器,存数组的数,表数组的长度
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=2e3+10;
ll p[N][N];
ll a[N][N];
int main()
{
ll n,m;
scanf("%lld%lld",&n,&m);
for(ll i=1;i<=2*n;i++)
for(ll j=1;j<=2*m;j++)
scanf("%lld",&p[i][j]);
for(ll i=1;i<2*n;i+=2)
for(ll j=1;j<=2*m;j++)
a[i/2+1][j]=p[i][j]+p[i+1][j];
for(ll i=1;i<=n;i++)
for(ll j=1;j<2*m;j+=2)
p[i][j/2+1]=a[i][j]+a[i][j+1];
for(ll i=1;i<=n;i++)
for(ll j=1;j<2*m;j+=2)
p[i][j/2+1]=a[i][j]+a[i][j+1];
for(ll i=1;i<=n;i++)
for(ll j=1;j<=m;j++)
a[j][i]=p[i][j];
for(ll i=1;i<=m;i++)
{
for(ll j=1;j<=n;j++)
printf("%lld ",a[i][j]);
puts("");
}
return 0;
}