前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【CodeForces706E】Working routine(二维链表)

【CodeForces706E】Working routine(二维链表)

作者头像
饶文津
发布2020-06-02 14:18:18
2310
发布2020-06-02 14:18:18
举报
文章被收录于专栏:饶文津的专栏饶文津的专栏

BUPT2017 wintertraining(15) #6B

题意

q次操作,每次把两个给定子矩阵交换,求最后的矩阵。(2 ≤ n, m ≤ 1000, 1 ≤ q ≤ 10 000)

题解

用R[i]和D[i]记录编号i的右方和下方的编号。交换两个子矩阵只要修改四周的R和D即可。为了方便查找给定位置的编号,每行每列都需要头结点,也就是给一个编号。

代码

#include <cstdio>
#include <iostream>
#define N 1005*1005
using namespace std;
int n,m,q;
int v[N],D[N],R[N];

int no(int x,int y){
	return x*(m+1)+y;
}
int main() {
	scanf("%d%d%d",&n,&m,&q);
	for(int i=0;i<=n;i++)
	for(int j=0;j<=m;j++)
		D[no(i,j)]=no(i+1,j),R[no(i,j)]=no(i,j+1);
	for(int i=1;i<=n;i++)
	for(int j=1;j<=m;j++)
		scanf("%d",&v[no(i,j)]);
	while(q--){
		int x,y,xx,yy,h,w;
		scanf("%d%d%d%d%d%d",&x,&y,&xx,&yy,&h,&w);
		int u=y-1,v=yy-1,uu=y-1+w,vv=yy-1+w;
		for(int i=1;i<x;i++)u=D[u],uu=D[uu];//u(x-1,y-1);uu(x-1,y-1+h)
		for(int i=1;i<xx;i++)v=D[v],vv=D[vv];//v(xx-1,yy-1);vv(xx-1,yy-1+h)
		for(int j=u,k=v,i=0;i<w;i++){//交换上面一行的D
			j=R[j],k=R[k];
			swap(D[j],D[k]);
		}
		for(int i=0;i<h;i++){//分别交换左右两列的R
			u=D[u],v=D[v];
			swap(R[u],R[v]);
			uu=D[uu],vv=D[vv];
			swap(R[uu],R[vv]);
		}
		for(int i=0;i<w;i++){//交换最下行的D
			u=R[u],v=R[v];
			swap(D[u],D[v]);
		}
	}
	
	for(int i=1,x;i<=n;i++){
		x=R[no(i,0)];
		for(int j=1;j<=m;j++)
			printf("%d ",v[x]),x=R[x];
		puts("");
	}
	return 0;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-03-24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题意
  • 题解
  • 代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档