【几何+模拟】二次元变换 计蒜客 - T3213
题目
aslky
有一个 n×n 的矩形,每个位置上都有一个数,有 q 次操作,每次他会让你上下翻转 (UD),左右反转 (LR),顺时针旋转 90∘(SZ),逆时针旋转 90∘(NZ),请你输出最后的矩形。
输入格式
第一行,两个数 n,q。
接下来 n 行,每行 n个数,代表矩形。
接下来 q 行,每行一个字符串,代表操作。
输出格式
n 行,每行 n 个数代表矩形。
数据规模与约定
对于 10% 的数据,1≤n≤10;
对于 100% 的数据,1≤n≤1000,1≤q≤1e6
Sample Input
3 3
1 2 3
1 2 3
1 2 3
NZ
SZ
SZ
Sample Output
1 1 1
2 2 2
3 3 3
题解
一次操作的复杂度为O(N^2),直接模拟复杂度为O(q*N^2),n<=1000,q<=1e6,计算次数为1e12,直接模拟必定超时,需要优化。如果该题无翻转变换只有旋转变化就简单了,SZ和NZ可以相互抵消,最后再对结果模4,就能大程度的优化操作次数。但加上翻转变化,那就要考虑两种翻转变化的优化,以及翻转变化和旋转变化的相互影响,还有图像在这几种变化中拥有多少种状态。
通过画图模拟,我们可以得出,图像在这2种变化中共有8种状态,首先是,原图像只通过旋转可以有4种状态,加上翻转变化后,我们发现无论是上下翻转还是左右翻转,其实都是把图像变成镜像面,图像在这种镜像面同样有4种形态,合起来共8种。
对翻转变化的优化,我们容易发现,同时经过两次上下翻转或者左右翻转后图像复原,所以,单向翻转变化可以模2.再对翻转变化进行研究,发现图像经过一次上下翻转一次左右翻转,会脱离镜像图变为原图。归纳:一个图像经过一次翻转变化后变为镜像图,这个镜像图再经过一次翻转变换后复原为原图。
接下来是研究两种变化之间的关系。容易发现上下翻转的图像通过旋转可变为左右翻转的图像,通过这个性质我们可以得出一个等式:LR=UD+2*SZ. 通过这个等式我们可以把所有的左右翻转变化变为上下翻转变化加上旋转变化。
剩下的就是考虑在翻转变化后旋转变化有何影响,容易知道,在镜像图状态时,对图像的顺时针旋转将相当于原图像的逆时针旋转,逆时针亦然。
暴力模板
#include<iostream>
#include<algorithm>
using namespace std; int s[][];
int f[][];
int n;
void UD() {
for (int i = ; i < n / ; i++) {
for (int j = ; j < n; j++) {
swap(s[i][j], s[n - i - ][j]);
}
}
}
void LR() {
for (int i = ; i < n / ; i++) {
for (int j = ; j < n; j++) {
swap(s[j][i], s[j][n - i - ]);
}
} }
void SZ() { for (int i = ; i < n; i++) {
for (int j = ; j < n; j++) {
f[j][n - i - ] = s[i][j];
}
}
for (int i = ; i < n; i++) {
for (int j = ; j < n; j++) {
s[i][j] = f[i][j];
}
}
} void NZ() {
for (int i = ; i < n; i++) {
for (int j = ; j < n; j++) {
f[n - - j][i] = s[i][j];
}
}
for (int i = ; i < n; i++) {
for (int j = ; j < n; j++) {
s[i][j] = f[i][j];
}
} } void pr() {
for (int i = ; i < n; i++) {
for (int j = ; j < n; j++)
cout << s[i][j] << ' ';
cout << '\n';
}
} int main() {
ios::sync_with_stdio();
int q;
char com[];
cin >> n >> q;
for (int i = ; i < n; i++)
for (int j = ; j < n; j++)
cin >> s[i][j]; while (q--) {
cin >> com;
switch (com[]) {
case 'U':
UD();
break;
case 'L':
LR();
break;
case 'S':
SZ();
break;
case 'N':
NZ();
break;
}
/*pr();
cout << '\n';*/
} pr();
}
数据生成
#include<iostream>
#include<time.h>
#include<algorithm>
#include<map>
using namespace std;
int r(int l, int r) {
return rand() % (r+ - l) + l;
}
char s[][] = { "UD","LR","SZ","NZ" }; int main() {
ios::sync_with_stdio(); srand(time());
int n=, q=r(,);
int k = ;
cout << n << ' ' << q << '\n';
cout << "1 2\n";
cout << "4 3\n";
while (q--) {
cout << s[r(, )] << '\n';
}
return ;
}
AC代码
#include<iostream>
#include<algorithm>
using namespace std; int s[][];
int f[][];
int n;
void UD() {
for (int i = ; i < n/; i++) {
for (int j = ; j < n; j++) {
swap(s[i][j], s[n - i-][j]);
}
}
} void SZ() { for (int i = ; i < n; i++) {
for (int j = ; j < n; j++) {
f[j][n - i-] = s[i][j];
}
}
for (int i = ; i < n; i++) {
for (int j = ; j < n; j++) {
s[i][j] = f[i][j];
}
}
} void pr() {
for (int i = ; i < n; i++) {
for (int j = ; j < n; j++)
cout << s[i][j] << ' ';
cout << '\n';
}
} int main() {
ios::sync_with_stdio();
int q;
char com[];
cin >> n >> q;
for (int i = ; i < n; i++)
for (int j = ; j < n; j++)
cin >> s[i][j]; int flag = ;
int sz = ;
while (q--) {
cin >> com;
switch (com[]){
case 'U':
if (flag == ) {
sz++;
flag *= -;
}
else {
sz--;
flag *= -;
}
break;
case 'L':
if (flag == ) {
sz--;
flag *= -;
}
else {
sz++;
flag *= -;
}
break; case 'S':
if (flag == ) {
sz++;
}
else {
sz--;
}
break;
case 'N':
if (flag == ) {
sz--;
}
else {
sz++;
}
break;
}
if(sz>=)
sz %= ;
else {
sz %= ;
sz += ;
}
}
if (flag==) {
while (sz--)SZ();
}
else {
sz--;
sz += ;
sz %= ;
while (sz--)SZ();
UD(); } pr(); }
【几何+模拟】二次元变换 计蒜客 - T3213的更多相关文章
- 计蒜客 NOIP 提高组模拟竞赛第一试 补记
计蒜客 NOIP 提高组模拟竞赛第一试 补记 A. 广场车神 题目大意: 一个\(n\times m(n,m\le2000)\)的网格,初始时位于左下角的\((1,1)\)处,终点在右上角的\((n, ...
- 计蒜客T2202 数三角形(提高组2017模拟赛(三)day2T3) LZOJ3878攻略
今天模拟赛考了一道计蒜客NOIP2017模拟赛(三)day2T3的数三角形,原题链接 https://nanti.jisuanke.com/t/T2202 ,LZOJ3878攻略.场上想了很久都没转化 ...
- 计蒜客模拟赛5 D2T1 成绩统计
又到了一年一度的新生入学季了,清华和北大的计算机系同学都参加了同一场开学考试(因为两校兄弟情谊深厚嘛,来一场联考还是很正常的). 不幸的是,正当老师要统计大家的成绩时,世界上的所有计算机全部瘫痪了. ...
- 计蒜客 31436 - 提高水平 - [状压DP]
题目链接:https://nanti.jisuanke.com/t/31436 作为一名车手,为了提高自身的姿势水平,平时的练习是必不可少的.小 J 每天的训练包含 $N$ 个训练项目,他会按照某个顺 ...
- 计蒜客 31434 - 广场车神 - [DP+前缀和]
题目链接:https://nanti.jisuanke.com/t/31434 小 D 是一位著名的车手,他热衷于在广场上飙车.每年儿童节过后,小 D 都会在广场上举行一场别样的车技大赛. 小 D 所 ...
- [计蒜客] 矿石采集【记搜、Tarjan缩点+期望Dp】
Online Judge:计蒜客信息学3月提高组模拟赛 Label:记搜,TarJan缩点,树状数组,期望Dp 题解 整个题目由毫无关联的两个问题组合成: part1 问题:对于每个询问的起点终点,求 ...
- 计蒜客 作弊揭发者(string的应用)
鉴于我市拥堵的交通状况,市政交管部门经过听证决定在道路两侧安置自动停车收费系统.当车辆驶入车位,系统会通过配有的摄像头拍摄车辆画面,通过识别车牌上的数字.字母序列识别车牌,通过连接车管所车辆信息数据库 ...
- 计蒜客的一道题dfs
这是我无聊时在计蒜客发现的一道题. 题意: 蒜头君有一天闲来无事和小萌一起玩游戏,游戏的内容是这样的:他们不知道从哪里找到了N根不同长度的木棍, 看谁能猜出这些木棍一共能拼出多少个不同的不等边三角形. ...
- 计蒜客 等边三角形 dfs
题目: https://www.jisuanke.com/course/2291/182238 思路: 1.dfs(int a,int b,int c,int index)//a,b,c三条边的边长, ...
随机推荐
- android studio 中jni底层日志的打印
1 添加ndk对log支持若需要添加ndk对log的支持,只需要通过以下2步即可实现. 1.1 修改Android.mk如生成的库文件是“.so文件”,则在Android.mk中添加如下内容:LOCA ...
- 【服务器】CentOs7系统使用宝塔面板搭建网站,有FTP配置(保姆式教程)
内容繁多,请耐心跟着流程走,在过程中遇到问题请在下面留言(我只是小白,请专业人士喷轻点). 这次用thinkphp5.1做演示,单纯的做演示,我打算下一篇文章用typecho(博客框架)演示. 前言 ...
- C#数据结构与算法系列(十四):递归——八皇后问题(回溯算法)
1.介绍 八皇后问题,是一个古老而著名的问题,是回溯算法的经典案例,该问题是国际西洋棋棋手马克斯.贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即 任意两个皇后都不能处 ...
- Mariadb之日志相关配置
前面我们聊到了mariadb的事务,以及事务隔离级别,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13198186.html:今天我们来聊一聊mariadb的 ...
- 报错 500 - Request processing failed; nested exception is com.alibaba.dubbo.rpc.RpcException的解决放案
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/loveliness_peri/artic ...
- 问题: No module named _gexf 解决方法
最近在参与一个社交网络数据可视化的项目,要在后端将社交网络信息组建成网络传至前端以使其可视化.前端使用Echart显示网络,后端要通过Python的Gexf库组建网络. Gexf库安装过程为: pip ...
- Linux 文件类型 ,文件权限
第一个字符段:文件类型.第二个组字符段又分为三段(每三个字符为一段不足用‘-’):文件属性. . drwxrwxrwx . -rwxr-xr-x 第一字符段: 第二字符组段依次为: - :普通文件 ...
- 二进制小数和IEEE浮点标准
二进制小数 首先复习进位计数制的要素: 数码:用来表示进制数的元素.比如 二进制数的数码为:0,1 十进制数的数码为:0,1,2,3,4,5,6,7,8,9 十六进制数的数码为:0,1,2,3,4,5 ...
- 如何将less编译成css文件__less自动编译成css的方法总结
作为css的预处理less,拥有着比css更快捷方便,扩展了css的变量.Mixin.函数等特性,使 CSS 更易维护和扩展. 如何你已经回使用css,那么less就很容易上手了.如果不使用less ...
- UVA 11383 Golden Tiger Claw 题解
题目 --> 题解 其实就是一个KM的板子 KM算法在进行中, 需要满足两个点的顶标值之和大于等于两点之间的边权, 所以进行一次KM即可. KM之后, 顶标之和就是最小的.因为如果不是最小的,就 ...