好精妙的一道题啊

传送门:here

大致题意:有一个$ n*m$的矩阵,q次询问每次交换给定两个无交矩阵的对应元素,求操作后的最终矩阵?

数据范围:$ n,m<=1000, q<=10000$

模拟赛的时候考到类似的,当时很快想到对每行维护一个$ treap/splay$的优秀做法,

然后感觉复杂度一千万$ *log$甚至比暴力慢(事实证明确实如此)

正解其实又好写又快速,不过对我这种数据结构做傻的菜鸡来说考场上确实是想不到啊....

$ solution:$

对于每个元素维护两个指针R(右边的那个元素标号)以及D(下边的那个元素标号)还有这个点的元素值

注意元素从$ (0,0)$开始记录

对于每次修改,会发现只有矩阵边缘的点的指针需要被修改(如图所示)

交换红蓝两个矩形时,只有涂黄色的格子下指针需要修改,涂绿色的格子右指针需要修改,对应swap一下即可

容易发现每次修改只有$ 2n+2m$格被修改了,因此总复杂度为$ O((n+m)q)$,非常优秀

(注意存图的时候第一行和第一列要空出来给空元素)

代码理解之后非常好写,以下是我的代码

#include<cstdio>
#include<iostream>
#define rt register int
using namespace std;
int i,j,k,m,n,x,y,z,cnt,p;
struct node{
int v,D,R;//D表示下,R表示右
}a[];
int main(){
scanf("%d %d %d",&n,&m,&k);n++;m++;
for(rt i=;i<=n;i++)
for(rt j=;j<=m;j++){
int v=(i-)*m+j;
if(i>&&j>)scanf("%d",&a[v].v);
if(i!=n)a[v].D=v+m;
if(j!=m)a[v].R=v+;
}
while(k--){
int X1,Y1,X2,Y2,L,C,g1=,g2=,g3,g4;
scanf("%d %d %d %d %d %d",&X1,&Y1,&X2,&Y2,&L,&C);
while(--X1)g1=a[g1].D;while(--X2)g2=a[g2].D;
while(--Y1)g1=a[g1].R;while(--Y2)g2=a[g2].R;
g3=g1;g4=g2;
for(rt i=;i<=L;i++)g1=a[g1].D,g2=a[g2].D,swap(a[g1].R,a[g2].R);
for(rt i=;i<=C;i++)g1=a[g1].R,g2=a[g2].R,swap(a[g1].D,a[g2].D);
for(rt i=;i<=C;i++)g3=a[g3].R,g4=a[g4].R,swap(a[g3].D,a[g4].D);
for(rt i=;i<=L;i++)g3=a[g3].D,g4=a[g4].D,swap(a[g3].R,a[g4].R);
}
int pla=a[a[].D].R;
for(rt i=;i<n;i++,pla=a[pla].D){
for(rt j=,d=pla;j<m;j++,d=a[d].R)printf("%d ",a[d].v);
putchar('\n');
}
return ;
}

codeforces706E的更多相关文章

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

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

随机推荐

  1. SourceInsight快捷键

    下载安装与设置 https://blog.csdn.net/k346k346/article/details/77412413 常用设置总结的还是比较全面的 问题: SourceInsight4.0中 ...

  2. HomeFragment 嵌套关系

    1.HomeFragment 在mainActivty 中调用: 2.HomeFragment 中: private ArrayList<Fragment> mFragments = ne ...

  3. Qt ------ 添加某个功能,比如(QSerialPort)注意事项

    添加某个功能,比如(QSerialPort),不仅需要保护头文件 还需要在.pro文件内添加 QT += serialport

  4. 你一直在找的 Mac 系统优化工具,可能就是这一款!

    文章来源:知乎 文章收录于:风云社区 www.scoee.com,提供上千款各类mac软件下载 尽管 Mac 上的维护工具总会被人诟病(通常是那些极客),但对于普通用户来说,像 CleanMyMac. ...

  5. SpringMvc+jQuery 文件拖拽上传、选择上传

    最近做了个简易的基于boostrap的文件上传功能,jsp版本的,后续会完善更多的功能,不过现在已经能用了,需要的小伙伴,直接引用下面的文件内容直接copy到自己的项目中就ok了,效果如图: file ...

  6. AI Accord.NET入门

    Accord.NET官网:http://accord-framework.net/index.html Accord.NET的Github页面:https://github.com/accord-ne ...

  7. .net 数据绑定gridview 和Repeater 序号,Container.ItemIndex

    gridview <asp:TemplateColumn HeaderText="编号">    <ItemTemplate>             &l ...

  8. 基于Asp.net C#实现HTML转图片(网页快照)

    一.实现方法 //WebSiteThumbnail.cs文件,在BS项目中需要添加对System.Windows.Forms的引用 using System; using System.Data; u ...

  9. 【自适应波束形成】MVDR(Minimum Variance Distortionless Response )笔记

    参考: https://blog.csdn.net/qq_40981790/article/details/80143524 1. MVDR简介(Minimum Variance Distortion ...

  10. freemarker迭代list、map等常规操作,将数据放到模板中

    转自:https://blog.csdn.net/wickedvalley/article/details/65937189 一.controller开始准备模型.数据1.po类 package co ...