codeforces706E
好精妙的一道题啊
传送门: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的更多相关文章
- 【CodeForces706E】Working routine(二维链表)
BUPT2017 wintertraining(15) #6B 题意 q次操作,每次把两个给定子矩阵交换,求最后的矩阵.(2 ≤ n, m ≤ 1000, 1 ≤ q ≤ 10 000) 题解 用R[ ...
随机推荐
- 既然写CSS很容易,那为什么大家还是把CSS写的那么烂呢?
在众成翻译上看到一篇不错的css文章,所以就给转过来. 在你开始阅读这篇文章之前,一定要做好心理准备.因为我写的 90% 都是在发牢骚,只有最后大概 10% 介绍 CSS 技巧之最佳实践.提前给你们打 ...
- ImageMagick - 设置透明带 AlphaChannel 的 png 图片的透明度
学习和使用ImageMagick也有几年时间了,其实对 ImageMagick 的了解还仅仅是皮毛吧. 最近在写代码的时候,遇到一个调整透明png图片透明度的问题: 当1张png图片,有些区域是透明的 ...
- c语言: 生成随机数
#include <time.h> srand((unsigned)time(NULL)); for(int i=0;i<10;i++) { //printf("%d\n& ...
- gradle的安装配置成功标志
gradle主要位于AndroidStudio中 看我的目录 在环境变量里添加用户变量 GRADLE_HOME 然后在环境变量 path 中增加 %GRADLE_HOME%\bin;,如图所示 测试配 ...
- HR算法具体过程
首先研究HR算法在概率分布估计中的实现,我们再考虑如何将其应用于频繁项挖掘中. 一.确定输入数据类型 def generate_uniform_distribution(k): raw_distrib ...
- Python加载声音
对于音频的操作可以使用pygame包中的sound 和 music对象进行音乐播放. Sound对象适合处理较短的音乐,如OGG和WAV格式的音频文件. Music对象出来可以播放OGG.WAV音频外 ...
- JDBC查询MySQL中的表
在数据库test里先创建表school,内容如下 创建接口对象:Statement stmt=con.createStatement(); //创建语句(Statement)ResultSet res ...
- 快速傅里叶变换(FFT)_转载
FFTFFT·Fast Fourier TransformationFast Fourier Transformation快速傅立叶变换 P3803 [模板]多项式乘法(FFT) 参考上文 首 ...
- Jqgrid pager 关于“local” dataType 动态加载数据分页的研究(没好用的研究结果)
系列索引 Web jquery表格组件 JQGrid 的使用 - 从入门到精通 开篇及索引 Web jquery表格组件 JQGrid 的使用 - 4.JQGrid参数.ColModel API.事件 ...
- 【简单易用的傻瓜式图标设计工具】Logoist 3.1 for Mac
[简介] Logoist 是一款Mac上强大易用的傻瓜式图标设计制作工具,通过使用内置模板和预设效果,您可以立即创建高质量的图形内容和艺术作品.通过使用该应用程序,可用于制作图标LOGO. 一款用于创 ...