题目

给出一个 \(n*m\) 的矩阵,每次交换两个等大的矩阵,输出 \(q\) 次操作后的矩阵


分析

维护向右和向下的指针,考虑最后输出只需要从每行的头指针向右跳,

那么修改实际上是将矩阵左边一列、上面一行、最后一行和最后一列向右下指针交换

时间复杂度 \(O((n+m)Q)\)


代码

#include <cstdio>
#include <cctype>
#include <algorithm>
using namespace std;
const int N=1048576;
int n,m,Q,you[N],xia[N],a[N],rk[1011][1011];
int iut(){
int ans=0; char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=ans*10+c-48,c=getchar();
return ans;
}
void print(int ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
int main(){
n=iut(),m=iut(),Q=iut();
for (int i=0;i<n+2;++i)
for (int j=0;j<m+2;++j) rk[i][j]=i*(m+2)+j;
for (int i=0;i<n+2;++i)
for (int j=0;j<m+1;++j) you[rk[i][j]]=rk[i][j+1];
for (int i=0;i<n+1;++i)
for (int j=0;j<m+2;++j) xia[rk[i][j]]=rk[i+1][j];
for (int i=1;i<=n;++i)
for (int j=1;j<=m;++j) a[rk[i][j]]=iut();
for (int T=1;T<=Q;++T){
int px=iut(),py=iut(),qx=iut(),qy=iut(),xl=iut(),yl=iut();
int tp=rk[px-1][0],tq=rk[qx-1][0];
for (int i=1;i<py;++i) tp=you[tp];
for (int i=1;i<qy;++i) tq=you[tq];
for (int Tp=tp,Tq=tq,i=0;i<xl+yl;++i)
if (i<xl){
Tp=xia[Tp],Tq=xia[Tq];
swap(you[Tp],you[Tq]);
}else{
Tp=you[Tp],Tq=you[Tq];
swap(xia[Tp],xia[Tq]);
}
for (int Tp=tp,Tq=tq,i=0;i<xl+yl;++i)
if (i>=yl){
Tp=xia[Tp],Tq=xia[Tq];
swap(you[Tp],you[Tq]);
}else{
Tp=you[Tp],Tq=you[Tq];
swap(xia[Tp],xia[Tq]);
}
}
for (int i=1;i<=n;++i){
int t=you[rk[i][0]];
for (;t!=rk[i][m+1];t=you[t]) print(a[t]),putchar(32);
putchar(10);
}
return 0;
}

#链表#CF706E Working routine的更多相关文章

  1. 十字链表 Codeforces Round #367 E Working routine

    // 十字链表 Codeforces Round #367 E Working routine // 题意:给你一个矩阵,q次询问,每次交换两个子矩阵,问最后的矩阵 // 思路:暴力肯定不行.我们可以 ...

  2. 【链表】【模拟】Codeforces 706E Working routine

    题目链接: http://codeforces.com/problemset/problem/706/E 题目大意: 给一个N*M的矩阵,Q个操作,每次把两个同样大小的子矩阵交换,子矩阵左上角坐标分别 ...

  3. Working routine CodeForces - 706E (链表)

    大意: 给定矩阵, q个操作, 每次选两个子矩阵交换, 最后输出交换后的矩阵 双向十字链表模拟就行了 const int N = 1500; int n, m, q; struct _ { int v ...

  4. 【CodeForces706E】Working routine(二维链表)

    BUPT2017 wintertraining(15) #6B 题意 q次操作,每次把两个给定子矩阵交换,求最后的矩阵.(2 ≤ n, m ≤ 1000, 1 ≤ q ≤ 10 000) 题解 用R[ ...

  5. [cf div 2 706E] Working routine

    [cf div 2 706E] Working routine Vasiliy finally got to work, where there is a huge amount of tasks w ...

  6. Redis链表实现

    链表在 Redis 中的应用非常广泛, 比如列表键的底层实现之一就是链表: 当一个列表键包含了数量比较多的元素, 又或者列表中包含的元素都是比较长的字符串时, Redis 就会使用链表作为列表键的底层 ...

  7. [数据结构]——链表(list)、队列(queue)和栈(stack)

    在前面几篇博文中曾经提到链表(list).队列(queue)和(stack),为了更加系统化,这里统一介绍着三种数据结构及相应实现. 1)链表 首先回想一下基本的数据类型,当需要存储多个相同类型的数据 ...

  8. 排序算法----基数排序(RadixSort(L))单链表智能版本

    转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...

  9. 防御性编程习惯:求出链表中倒数第 m 个结点的值及其思想的总结

    防御性编程习惯 程序员在编写代码的时候,预料有可能出现问题的地方或者点,然后为这些隐患提前制定预防方案或者措施,比如数据库发生异常之后的回滚,打开某些资源之前,判断图片是否存在,网络断开之后的重连次数 ...

  10. 时间复杂度分别为 O(n)和 O(1)的删除单链表结点的方法

    有一个单链表,提供了头指针和一个结点指针,设计一个函数,在 O(1)时间内删除该结点指针指向的结点. 众所周知,链表无法随机存储,只能从头到尾去遍历整个链表,遇到目标节点之后删除之,这是最常规的思路和 ...

随机推荐

  1. win32 - WriteProcessMemory的使用

    使用这个api可以在指定的进程中将数据写入内存区域. 注意:以管理员权限运行,并且以x64调试. #include <windows.h> #include <iostream> ...

  2. Go 项目的文件布局

    转自 kcq 的 https://github.com/golang-standards/project-layout https://github.com/golang-standards/proj ...

  3. ADVMP 三代壳(vmp加固)原理分析(加壳流程)

    开源项目地址 https://github.com/chago/ADVMP vmp 加固可以说时各大加固厂商的拳头产品了,这个开源项目虽然不是十分完善,让我们可以一览vmp加固的原理,是十分好的学习资 ...

  4. 【Android逆向】定位native函数在哪个so中方法

    1. 在逆向过程中经常需要定位方法在哪个so中,而app加载的so很多,比如 那么如何快速定位方法在哪里呢 2. 比如如下案例,首先看日志 03-28 11:01:56.457 14566 14566 ...

  5. Centos下配置python环境

    https://blog.csdn.net/longzhoufeng/article/details/109879818

  6. 【Filament】纹理贴图

    1 前言 ​ 本文主要介绍使用 Filament 实现纹理贴图,读者如果对 Filament 不太熟悉,请回顾以下内容. Filament环境搭建 绘制三角形 绘制矩形 绘制圆形 绘制立方体 ​ Fi ...

  7. 【Azure 环境】使用az login登录遇见OSError: [WinError -2146893813] : '' 错误

    问题描述 使用 az login指令登录,遇见 OS Error: [WinError -2146893813] : '', 在指令中添加 --debug后,输出的错误消息为: urllib3.con ...

  8. uniapp同步将本地图片转换为base64,支持微信、H5、APP

    接上篇,少了一个方法的源代码. 先上代码: ploadFilePromiseSync = (url) => { return new Promise((resolve, reject) => ...

  9. Java 常用类 String类与其他结构之间的转换-----String 与 基本数据类型,包装类之间的转换

    1 /* 2 涉及到String类与其他结构之间的转换 3 4 */ 5 6 //String 与 基本数据类型,包装类之间的转换 7 //String --->基本数据类型,包装类:调用包装类 ...

  10. CUDA指针数组Kernel函数

    技术背景 在前面的一篇文章中,我们介绍了在C++中使用指针数组的方式实现的一个不规则的二维数组.那么如果我们希望可以在CUDA中也能够使用到这种类似形式的不规则的数组,有没有办法可以直接实现呢?可能过 ...