CF1458C Latin Square

题意:

T 组测试数据,每次给一个 n×nn\times nn×n 的矩阵,每行每列都是个 1→n1\to n1→n 的排列。有 m 次操作,如果是 UDLR 就是要把整个矩阵每行/每列往一个方向循环移动一格。如果是 IC,就是把矩阵每行/每列变成原来的逆排列。求最后的矩阵。
逆排序定义:
一个序列p1,p2,....,pnp_{1},p_{2},....,p_{n}p1​,p2​,....,pn​的逆排序是q1,q2,...qnq_{1},q_{2},...q_{n}q1​,q2​,...qn​,对于所有1≤i≤n1\le i\le n1≤i≤n有pqi=ip_{q_{i}}=ipqi​​=i

数据范围:1≤T≤1000,1≤∑n≤1000,1≤∑m≤105,1≤ai,j≤n。数据范围:1\le T\le 1000,1\le \sum n\le 1000,1\le \sum m\le 10^5 ,1\le a_{i,j}\le n。数据范围:1≤T≤1000,1≤∑n≤1000,1≤∑m≤105,1≤ai,j​≤n。

题解:

UDLR都好操作,我们只需要维护x和y分别移动了多少即可
但问题就是存在IC操作,就是这个逆排序如何理解?
对于排序p1,p2,....,pnp_{1},p_{2},....,p_{n}p1​,p2​,....,pn​,我们可以把每个元素看作是一个二维坐标(i,pi)(i,p_{i})(i,pi​),那么这个排序的逆元相当于(pi,i)(p_{i},i)(pi​,i),即交换两维坐标
那么我们就可以把这个矩阵看作是三维空间里的点(x,y,ax,y)(x,y,a_{x,y})(x,y,ax,y​),III操作就是交换x和ax,ya_{x,y}ax,y​,CCC操作就是交换了y和ax,ya_{x,y}ax,y​,LRUD就是正常的对x或y的修改
这样,对于LRUD,记录每一维的增量,对于IC,记录当前每一维是原来的第几维,这样不就将所有操作O(1)解决了吗
我们用数组p来记录当前是第几维,I,C操作就是交换数组p
秒啊~这个题
详细看代码

代码:

#include <bits/stdc++.h>
#include <unordered_map>
#define debug(a, b) printf("%s = %d\n", a, b);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> PII;
clock_t startTime, endTime;
//Fe~Jozky
const ll INF_ll= 1e18;
const int INF_int= 0x3f3f3f3f;
void read(){};
template <typename _Tp, typename... _Tps> void read(_Tp& x, _Tps&... Ar)
{x= 0;char c= getchar();bool flag= 0;while (c < '0' || c > '9')flag|= (c == '-'), c= getchar();while (c >= '0' && c <= '9')x= (x << 3) + (x << 1) + (c ^ 48), c= getchar();if (flag)x= -x;read(Ar...);
}
template <typename T> inline void write(T x)
{if (x < 0) {x= ~(x - 1);putchar('-');}if (x > 9)write(x / 10);putchar(x % 10 + '0');
}
void rd_test()
{#ifdef ONLINE_JUDGE
#elsestartTime = clock ();freopen("data.in", "r", stdin);
#endif
}
void Time_test()
{#ifdef ONLINE_JUDGE
#elseendTime= clock();printf("\nRun Time:%lfs\n", (double)(endTime - startTime) / CLOCKS_PER_SEC);
#endif
}
const int maxn=2e3+9;
int a[maxn*maxn][3];
int b[maxn][maxn];
int p[3];
int x[3];
int n,m;
void add(int &x){//正向移动 x++;if(x>n)x-=n;
}
void del(int &x){//方向移动 x--;if(x<0)x+=n;
}
void solve(){read(n,m);for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){int pos=(i-1)*n+j;int x;read(x);a[pos][0]=i;a[pos][1]=j;a[pos][2]=x;//存下三维信息 }}for(int i=0;i<3;i++){p[i]=i;x[i]=0;    }string s;cin>>s;for(int i=0;i<m;i++){if(s[i]=='U')del(x[p[0]]);//行-- if(s[i]=='D')add(x[p[0]]);//行++if(s[i]=='L')del(x[p[1]]);//列-- if(s[i]=='R')add(x[p[1]]);//列++ if(s[i]=='I')swap(p[1],p[2]);//行逆排序,将列与值交换 if(s[i]=='C')swap(p[0],p[2]);//列逆排序 }for(int i=1;i<=n*n;i++){for(int j=0;j<3;j++)//执行对应操作 a[i][j]=(a[i][j]+x[j]-1)%n+1;b[a[i][p[0]]][a[i][p[1]]]=a[i][p[2]];//将变换后的值赋给b } for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){printf("%d ",b[i][j]);}printf("\n"); }
}
int main()
{rd_test();int t;read(t);while(t--){solve();}//Time_test();
}

CF1458C Latin Square相关推荐

  1. UA MATH571B 试验设计IV RCBD与Latin Square上

    UA MATH571B 试验设计IV RCBD与Latin Square上 RCBD Latin Square Design Graeco-Latin Square Design BIBD RCBD ...

  2. 随机拉丁方阵(Random Latin squares)

    大小为n的拉丁方阵是指各行列中的每个符号仅出现一次,随机拉丁方阵生成任意给定n个符号的随机输出. 以n=4为例生成随机拉丁方阵 0 2 3 1 2 1 0 3 3 0 1 2 1 3 2 0 任务 创 ...

  3. Java语言程序设计(基础篇)第八章(2 19 36)

    第二题(求矩阵主对角线元素的和) import java.util.Scanner; public class Text {public static void main(String[] args) ...

  4. UA MATH571B 试验设计 QE练习题 不使用代码分析试验结果I

    UA MATH571B 试验设计 QE练习题 不使用代码分析试验结果I 2014年5月第一题 2015年5月第一题 2016年5月第二题 2017年1月第一题 不使用代码分析试验结果考察的是对试验设计 ...

  5. UA MATH571B 试验设计 总结 判断试验类型的例题

    UA MATH571B 试验设计 总结 判断试验类型的例题 2015年5月第二题:Blocking factorial design 2015年5月第三题:Split-plot Design 2017 ...

  6. UA MATH571B 试验设计 总结 试验的类型与选择

    UA MATH571B 试验设计 总结 试验的类型与选择 试验的意义,试验设计的意义 单个treatment factor的试验 多个treatment factor的试验 多个treatment f ...

  7. UA MATH571B 试验设计 QE练习题1

    UA MATH571B 试验设计 QE练习题1 第一题 第二题 第三题 这是2014年一月Methodology的1-3题. 第一题 希望今年的考试没有这种概念题! 第一个是对的,比较多正态总体的方差 ...

  8. UA MATH571B 试验设计V 析因设计简介

    UA MATH571B 试验设计V 析因设计简介 模型设定与假设 Response Surface 一般的析因设计 区组析因设计 之前讲过的单因素到Graeco-Latin Square设计处理的都是 ...

  9. Java黑皮书课后题第8章:**8.36(拉丁方阵)拉丁方阵是一个n*n的数组,其中有n个不同的拉丁字母,并且每个拉丁字母恰好只在每行和每列中出现一次。编写一个程序,提示用户输入数字n和字符数组

    **8.36(拉丁方阵)拉丁方阵是一个n*n的数组,其中有n个不同的拉丁字母,并且每个拉丁字母恰好只在每行和每列中出现一次 题目 题目描述与运行示例 破题 代码 题目 题目描述与运行示例 **8.36 ...

最新文章

  1. Spring Roo 2 使用分析
  2. iOSunicode转中文
  3. 经典C语言程序100例之八三
  4. 2009年9月等考试题及答案51CTO站第一时间发布
  5. 关闭注册表编辑器,重新启动计算机后生效。这样资源管理器重启后就不会自动重启了。...
  6. 从Tom说JSP原理
  7. docker安装与学习
  8. ACL2020 奇葩论文标题大赏
  9. JAVA基础知识总结2(语法基础)
  10. 酒店管理系统-概要设计报告
  11. 在EXCEL中插入超级链接
  12. matlab fisher z变换,关于GCA统计
  13. 《算法竞赛进阶指南》 防线
  14. python画图显示中文加标题控制字体
  15. 【BZOJ4372】烁烁的游戏(点分树)
  16. ps2口键盘改usb计算机设置,轻松把PS2键盘、鼠标接口改造成USB接口
  17. 低价神话缔造者!宏碁A500最全面评测
  18. MySQL存储引擎 优化 索引问题
  19. mql4 c语言,MQL4基础:运算符和表达式 -
  20. 【报告分享】流量聚拢营销下沉-TalkingData(附下载)

热门文章

  1. 这些数学趣图,数学老师看了后会怎么想?
  2. 如何用数学方法估算一个女生前男友的数量?
  3. 用Python进行数据探索,探索竞赛优胜方案
  4. 菜鸟学习数据科学家 5 大误区
  5. Google 机器学习应用的43条经验法则
  6. Python为什么是编程语言中最skr的?
  7. 等我敲完这行代码,就和你离婚!
  8. 数据挖掘算法之决策树算法总结
  9. 读书笔记-互联网思维必读10本书之一《免费》
  10. php 查询数据是否大于,怎么实现从数据查询数据的时候判断如果数据大于N条分次查询 递归吗?...