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[ ...
随机推荐
- FluentScheduler定时器计划任务
http://www.cnblogs.com/lgxlsm/p/6734011.html 用了FluentScheduler后,再也比想用timer计时器了. FluentScheduler 是 .N ...
- ubuntu下 pthread_mutex_init man中查不到
问题: 如题所述,包括pthread_mutex_init 和 pthread_mutex_lock 这些函数都找不到 解决办法: 安装manpages:manpages-posix-dev Mint ...
- mysql优化好文
https://segmentfault.com/a/1190000006158186
- Constructor >> @Autowired >> @PostConstruct
从依赖注入的字面意思就可以知道,要将对象p注入到对象a,那么首先就必须得生成对象p与对象a,才能执行注入.所以,如果一个类A中有个成员变量p被@Autowired注解,那么@Autowired注入是发 ...
- Luogu P2519 [HAOI2011]problem a
题目链接 \(Click\) \(Here\) \(DP\)神题.以后要多学习一个,练一练智商. 关键点在于把"有\(a_i\)个人分数比我高,\(b_i\)个人分数比我低"这句话 ...
- Vue(小案例)底部tab栏和顶部title栏的实现
---恢复内容开始--- 一.前言 1.底部tab栏实现 2.顶部title栏实现 二.主要内容 1.底部tab栏实现(将底部导航提取到公共的组件中) 具体效果:当点击切换不同的tab的时候,对应 ...
- angular cli全局版本大于本地版本 把本地版本升级方式
查看 angular 版本 ng version 如出现提示 Your global Angular CLI version (xxx) is greater than your local ver ...
- mybatis多数据源报错
2018-12-06 16:58:35,709 [ main ] - [ INFO ] [ org.springframework.core.KotlinDetector : 57 ] - Kotli ...
- nginx做负载均衡+keepalived(做主备)
部署Nginx 一,安装nginx依赖: 查看是否已经安装 rpm -qa |grep gcc rpm -qa |grep openssl-devel rpm -qa |grep pcre-devel ...
- maven坑-Failure to transfer org.apache.maven:maven
参考网址:http://www.mkyong.com/maven/how-to-convert-maven-java-project-to-support-eclipse-ide/ https://b ...