题目传送门(内部题10)


输入格式

输入第一行三个数$N,M,Q$分别表示棋盘的行数、列数和操作个数。
接下来$N$行每行$M$个数表示一开始棋盘上宝物的价值。
接下来$Q$行每行$3$个数$x,y,c$表示操作区域为以第$x$行第$y$列为左上角的边长为$c$的正方形。


输出格式

输出一个$N\times M$的矩阵表示最后的棋盘。


样例

样例输入:

4 4 3
1 2 3 4
5 6 7 8
1 2 3 4
5 6 7 8
1 1 3
3 3 2
2 2 2

样例输出:

1 5 1 4
2 7 6 8
3 7 2 3
5 6 8 4


数据范围与提示

对于$30%$的数据,$N,M,Q\leqslant 100$。
对于另外$30%$的数据,保证所有$Q$个正方形两两之间不相交或相等。
对于$100%$的数据,$N,M,Q\leqslant 2,000$。所有数取值都为$0\sim 9$。


题解

$30\%$算法:

暴力更改即可。

时间复杂度:$\Theta(n^3)$。

期望得分:$30$分。

实际得分:$30$分。

$30\%pro$算法:

$whs$式毒瘤拆循环。

时间复杂度:$\Theta(n^3)$。

期望得分:$30$分。

实际得分:$60$分。

$30\%pro+$算法:

注意到所有的点都是$0\sim 9$,所以可以用$HZOI$式毒瘤字符读入输出。

时间复杂度:$\Theta(n^3)$。

期望得分:$30$分。

实际得分:$100$分。

$100\%$算法:

直接更改肯定会$TLE$,于是我们就来看一个新鲜的东西:十字链表。

简单来说,十字链表与普通链表的区别在于不仅记录了左右,而且记录了上下,于是我们只需要更改边缘一圈的值即可,但是代码实现相当繁琐,需要注意的细节较多。

时间复杂度:$\Theta(Q\times N\times $巨大的常数$)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

$30\%pro+$算法:

#include<bits/stdc++.h>
int n,m,q;
char map[2050][2050];
int main()
{
scanf("%d%d%d",&n,&m,&q);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%s",&map[i][j]);
while(q--)
{
int x,y,c;
scanf("%d%d%d",&x,&y,&c);
int len=c-1;
while(len>0)
{
for(int i=0;i<len;i++)
{
char w1=map[x][y+i];
char w2=map[x+i][y+len];
char w3=map[x+len][y+len-i];
char w4=map[x+len-i][y];
map[x+i][y+len]=w1;
map[x+len][y+len-i]=w2;
map[x+len-i][y]=w3;
map[x][y+i]=w4;
}
len-=2;
x++;
y++;
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
printf("%c ",map[i][j]);
printf("\n");
}
return 0;
}

$100\%$算法:

#include<bits/stdc++.h>
using namespace std;
int n,m,q;
int Map[5000][5000],wzc[5000][5000];
int p[5000000],wtf[5000000][4];
int cnt,tmp;
int now,flag;
int ls,rs,lx,rx,lsd,rsd,lxd,rxd;
int main()
{
scanf("%d%d%d",&n,&m,&q);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&Map[i][j]);
for(int i=0;i<=n+1;i++)
for(int j=0;j<=m+1;j++)
{
wzc[i][j]=++cnt;
p[cnt]=Map[i][j];
}
for(int i=0;i<=n+1;i++)
for(int j=0;j<=m+1;j++)
{
wtf[wzc[i][j]][0]=wzc[i-1][j];
wtf[wzc[i][j]][1]=wzc[i][j+1];
wtf[wzc[i][j]][2]=wzc[i+1][j];
wtf[wzc[i][j]][3]=wzc[i][j-1];
}
while(q--)
{
int x,y,c;
scanf("%d%d%d",&x,&y,&c);
now=wzc[x][0];
flag=1;
while(y--)
{
if(wtf[wtf[now][flag]][0]==now)tmp=0;
if(wtf[wtf[now][flag]][1]==now)tmp=1;
if(wtf[wtf[now][flag]][2]==now)tmp=2;
if(wtf[wtf[now][flag]][3]==now)tmp=3;
now=wtf[now][flag];
switch(tmp)
{
case 0:flag=2;break;
case 1:flag=3;break;
case 2:flag=0;break;
case 3:flag=1;break;
}
}
ls=now;
lsd=flag;
for(int i=1;i<c;++i)
{
if(wtf[wtf[now][flag]][0]==now)tmp=0;
if(wtf[wtf[now][flag]][1]==now)tmp=1;
if(wtf[wtf[now][flag]][2]==now)tmp=2;
if(wtf[wtf[now][flag]][3]==now)tmp=3;
now=wtf[now][flag];
switch(tmp)
{
case 0:flag=2;break;
case 1:flag=3;break;
case 2:flag=0;break;
case 3:flag=1;break;
}
}
flag=(flag+1)%4;
rs=now;
rsd=flag;
for(int i=1;i<c;++i)
{
if(wtf[wtf[now][flag]][0]==now)tmp=0;
if(wtf[wtf[now][flag]][1]==now)tmp=1;
if(wtf[wtf[now][flag]][2]==now)tmp=2;
if(wtf[wtf[now][flag]][3]==now)tmp=3;
now=wtf[now][flag];
switch(tmp)
{
case 0:flag=2;break;
case 1:flag=3;break;
case 2:flag=0;break;
case 3:flag=1;break;
}
}
flag=(flag+1)%4;
rx=now;
rxd=flag;
for(int i=1;i<c;++i)
{
if(wtf[wtf[now][flag]][0]==now)tmp=0;
if(wtf[wtf[now][flag]][1]==now)tmp=1;
if(wtf[wtf[now][flag]][2]==now)tmp=2;
if(wtf[wtf[now][flag]][3]==now)tmp=3;
now=wtf[now][flag];
switch(tmp)
{
case 0:flag=2;break;
case 1:flag=3;break;
case 2:flag=0;break;
case 3:flag=1;break;
}
}
flag=(flag+1)%4;
lx=now;
lxd=flag;
for(int i=1;i<=c;++i)
{
int d1=wtf[rs][(rsd+3)%4];
int d2=wtf[rx][(rxd+3)%4];
int d3=wtf[lx][(lxd+3)%4];
int d4=wtf[ls][(lsd+3)%4];
int t1,t2,t3,t4;
if(wtf[wtf[rs][(rsd+3)%4]][0]==rs)t1=0;
if(wtf[wtf[rx][(rxd+3)%4]][0]==rx)t2=0;
if(wtf[wtf[lx][(lxd+3)%4]][0]==lx)t3=0;
if(wtf[wtf[ls][(lsd+3)%4]][0]==ls)t4=0;
if(wtf[wtf[rs][(rsd+3)%4]][1]==rs)t1=1;
if(wtf[wtf[rx][(rxd+3)%4]][1]==rx)t2=1;
if(wtf[wtf[lx][(lxd+3)%4]][1]==lx)t3=1;
if(wtf[wtf[ls][(lsd+3)%4]][1]==ls)t4=1;
if(wtf[wtf[rs][(rsd+3)%4]][2]==rs)t1=2;
if(wtf[wtf[rx][(rxd+3)%4]][2]==rx)t2=2;
if(wtf[wtf[lx][(lxd+3)%4]][2]==lx)t3=2;
if(wtf[wtf[ls][(lsd+3)%4]][2]==ls)t4=2;
if(wtf[wtf[rs][(rsd+3)%4]][3]==rs)t1=3;
if(wtf[wtf[rx][(rxd+3)%4]][3]==rx)t2=3;
if(wtf[wtf[lx][(lxd+3)%4]][3]==lx)t3=3;
if(wtf[wtf[ls][(lsd+3)%4]][3]==ls)t4=3;
wtf[d1][t1]=ls;
wtf[d2][t2]=rs;
wtf[d3][t3]=rx;
wtf[d4][t4]=lx;
wtf[ls][(lsd+3)%4]=d1;
wtf[rs][(rsd+3)%4]=d2;
wtf[rx][(rxd+3)%4]=d3;
wtf[lx][(lxd+3)%4]=d4;
if(wtf[wtf[ls][lsd]][0]==ls)tmp=0;
if(wtf[wtf[ls][lsd]][1]==ls)tmp=1;
if(wtf[wtf[ls][lsd]][2]==ls)tmp=2;
if(wtf[wtf[ls][lsd]][3]==ls)tmp=3;
ls=wtf[ls][lsd];
switch(tmp)
{
case 0:lsd=2;break;
case 1:lsd=3;break;
case 2:lsd=0;break;
case 3:lsd=1;break;
}
if(wtf[wtf[rs][rsd]][0]==rs)tmp=0;
if(wtf[wtf[rs][rsd]][1]==rs)tmp=1;
if(wtf[wtf[rs][rsd]][2]==rs)tmp=2;
if(wtf[wtf[rs][rsd]][3]==rs)tmp=3;
rs=wtf[rs][rsd];
switch(tmp)
{
case 0:rsd=2;break;
case 1:rsd=3;break;
case 2:rsd=0;break;
case 3:rsd=1;break;
}
if(wtf[wtf[rx][rxd]][0]==rx)tmp=0;
if(wtf[wtf[rx][rxd]][1]==rx)tmp=1;
if(wtf[wtf[rx][rxd]][2]==rx)tmp=2;
if(wtf[wtf[rx][rxd]][3]==rx)tmp=3;
rx=wtf[rx][rxd];
switch(tmp)
{
case 0:rxd=2;break;
case 1:rxd=3;break;
case 2:rxd=0;break;
case 3:rxd=1;break;
}
if(wtf[wtf[lx][lxd]][0]==lx)tmp=0;
if(wtf[wtf[lx][lxd]][1]==lx)tmp=1;
if(wtf[wtf[lx][lxd]][2]==lx)tmp=2;
if(wtf[wtf[lx][lxd]][3]==lx)tmp=3;
lx=wtf[lx][lxd];
switch(tmp)
{
case 0:lxd=2;break;
case 1:lxd=3;break;
case 2:lxd=0;break;
case 3:lxd=1;break;
}
}
}
for(int i=1;i<=n;i++)
{
now=wzc[i][0];
flag=1;
for(int j=1;j<=m;j++)
{
if(wtf[wtf[now][flag]][0]==now)tmp=0;
if(wtf[wtf[now][flag]][1]==now)tmp=1;
if(wtf[wtf[now][flag]][2]==now)tmp=2;
if(wtf[wtf[now][flag]][3]==now)tmp=3;
now=wtf[now][flag];
switch(tmp)
{
case 0:flag=2;break;
case 1:flag=3;break;
case 2:flag=0;break;
case 3:flag=1;break;
}
printf("%d ",p[now]);
}
puts("");
}
return 0;
}

rp++

[CSP-S模拟测试]:Drink(模拟)的更多相关文章

  1. 模拟测试—moq:简单一两句

    在Xunit的基础上,说话模拟测试. 假如我们有这样一个控制器里面有这样一个方法,如图 我们在对Bar测试得时候,如果测试未通过,错误有可能来至于Bar,也有可能错误来至于serverde Foo方法 ...

  2. Android单元测试与模拟测试详解

    测试与基本规范 为什么需要测试? 为了稳定性,能够明确的了解是否正确的完成开发. 更加易于维护,能够在修改代码后保证功能不被破坏. 集成一些工具,规范开发规范,使得代码更加稳定( 如通过 phabri ...

  3. [开源]微信在线信息模拟测试工具(基于Senparc.Weixin.MP开发)

    目前为止似乎还没有看到过Web版的普通消息测试工具(除了官方针对高级接口的),现有的一些桌面版的几个测试工具也都是使用XML直接请求,非常不友好,我们来尝试做一个“面向对象”操作的测试工具. 测试工具 ...

  4. 安装nginx python uwsgi环境 以及模拟测试

    uwsgi帮助文档: http://uwsgi-docs-cn.readthedocs.io/zh_CN/latest/WSGIquickstart.html http://uwsgi-docs.re ...

  5. 利用Python中的mock库对Python代码进行模拟测试

    这篇文章主要介绍了利用Python中的mock库对Python代码进行模拟测试,mock库自从Python3.3依赖成为了Python的内置库,本文也等于介绍了该库的用法,需要的朋友可以参考下     ...

  6. 转 C#实现PID控制的模拟测试和曲线绘图

    C#实现PID控制的模拟测试和曲线绘图   本文分两部分,一部分是讲PID算法的实现,另一部分是讲如何用动态的曲线绘制出PID运算的结果. 首先,PID算法的理论模型请参考自动控制理论,最早出现的是模 ...

  7. Mockito:一个强大的用于Java开发的模拟测试框架

    https://blog.csdn.net/zhoudaxia/article/details/33056093 介绍 本文将介绍模拟测试框架Mockito的一些基础概念, 介绍该框架的优点,讲解应用 ...

  8. NOIP模拟测试1(2017081501)

    好,今天是cgg第一次举行模拟测试,希望各位支持. 时间限制:2小时 题目链接: 题目一:水得都没名字了 题目二:车站 题目三:选数 不要觉得2小时太少,我的题目很良心,都很简单. 答案可以在模拟测试 ...

  9. Mock 模拟测试简介及 Mockito 使用入门

    Mock 是什么mock 测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法.这个虚拟的对象就是mock对象.mock对象就是真实对象在调试期间的代 ...

随机推荐

  1. Laravel 实现指定用户下的设备分页(与查询指定分类下的文章原理相同)

    <?php //控制器 namespace App\Http\Controllers\Api\User; use App\Http\Controllers\Controller; use Ill ...

  2. 分库分布的几件小事(五)MYSQL读写分离

    1.为什么进行读写分离 这个,高并发这个阶段,那肯定是需要做读写分离的,啥意思?因为实际上大部分的互联网公司,一些网站,或者是app,其实都是读多写少.所以针对这个情况,就是写一个主库,但是主库挂多个 ...

  3. LeetCode 腾讯精选50题--数组中的第K个最大元素

    好吧,不得不承认,书上看到的始终不是自己的,只有亲身时间过才会明白该怎么操作. 找数组中第K个最大元素,简而言之就是先排序,不论使用哪种算法,都需要先排序,确认位置,由于数组可以通过下标直接访问,所以 ...

  4. Winfrom 简单的进度条小程序

    使用Winform空间编写简单的进度条小程序: 所需控件:Lable 标签  TextBox  文本框  progressBar  进度条控件  timer 定时器 下面是源码及效果图: /// &l ...

  5. Caffe测试单独的算子

    最近有一个需求是测试单独算子在CPU.Caffe使用的GPU.cuDNN上的性能,一个是使用caffe的time问题,还有一个是使用单独的test功能. time选项的使用,大家都比较熟悉,单独的te ...

  6. jQuery实现照片墙,附步骤详解

    现在一直使用vue写项目,发现之前的js都很生疏了,写个小demo练下手,看一下最终效果展示 功能点:点击添加图片随机添加一张图片,图片可以拖动,可以点击删除 技能点: 主要使用了jQuery的一些方 ...

  7. 获得npm server 上 package 的版本信息

    通过这个命令可以获取package 的历史版本信息 npm view packagename   versions

  8. java_day10_多线程

    第十章:线程 1.进程和线程的概述 1)进程和线程定义 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和 ...

  9. 检验注解@Validated 和@valid说明

  10. Cordova热更新和App升级

    web代码的更新此更新方式,只需要更新web前段代码,不需要更新android的原生代码.只是对js.html等的更新.1.添加插件 Cordova Hot Code Pushcordova plug ...