CF1458C Latin Square
对于一个排列 ,将其表示为 , 那么它的逆排列可表示为
这道题 均为排列,考虑用三元组 表示。(为了方便下标从 开始)
那么操作可表示为:
R
L
D
U
I
C
只需要记录每一维的偏移量与最终的位置即可。
时间复杂度 。
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1000 , MAXM = 1e5;
int T , n , m , a[ MAXN + 5 ][ MAXN + 5 ][ 3 ] , b[ MAXN + 5 ][ MAXN + 5 ];
char op[ MAXM + 5 ];
int tag[ 3 ] , p[ 3 ];
int main( ) {
scanf("%d",&T);
while( T -- ) {
scanf("%d %d",&n,&m);
for( int i = 0 ; i < n ; i ++ )
for( int j = 0 ; j < n ; j ++ ) {
a[ i ][ j ][ 0 ] = i, a[ i ][ j ][ 1 ] = j;
scanf("%d",&a[ i ][ j ][ 2 ]); a[ i ][ j ][ 2 ] --;
}
scanf("%s", op + 1 );
for( int i = 0 ; i < 3 ; i ++ ) p[ i ] = i , tag[ i ] = 0;
for( int i = 1 ; i <= m ; i ++ ) {
if( op[ i ] == 'R' ) tag[ p[ 1 ] ] ++;
if( op[ i ] == 'L' ) tag[ p[ 1 ] ] --;
if( op[ i ] == 'D' ) tag[ p[ 0 ] ] ++;
if( op[ i ] == 'U' ) tag[ p[ 0 ] ] --;
if( op[ i ] == 'I' ) swap( p[ 1 ] , p[ 2 ] );
if( op[ i ] == 'C' ) swap( p[ 0 ] , p[ 2 ] );
}
for( int i = 0 ; i < 3 ; i ++ ) tag[ i ] = ( tag[ i ] % n + n ) % n;
for( int i = 0 ; i < n ; i ++ )
for( int j = 0 ; j < n ; j ++ )
b[ ( a[ i ][ j ][ p[ 0 ] ] + tag[ 0 ] ) % n ][ ( a[ i ][ j ][ p[ 1 ] ] + tag[ 1 ] ) % n ] = ( a[ i ][ j ][ p[ 2 ] ] + tag[ 2 ] ) % n;
for( int i = 0 ; i < n ; i ++ )
for( int j = 0 ; j < n ; j ++ )
printf("%d%c", b[ i ][ j ] + 1 , j == n - 1 ? '\n' : ' ' );
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现