Working routine CodeForces - 706E (链表)

时间:2023-03-30 11:43:26

大意: 给定矩阵, q个操作, 每次选两个子矩阵交换, 最后输出交换后的矩阵

双向十字链表模拟就行了

const int N = 1500;
int n, m, q;
struct _ {
int v,l,r,u,d;
} f[N*N];
int ans[N][N];
int has(int i,int j) {return 1010*(i+2)+(j+2);}
int get(int i,int j) {
int r = f[has(0,j)].d;
REP(k,1,i-1) r=f[r].d;
return r;
} void pr() {
REP(j,1,m) {
int x = get(1,j);
REP(i,1,n) ans[i][j]=f[x].v,x=f[x].d;
}
REP(i,1,n) {
REP(j,1,m) printf("%d ", ans[i][j]);hr;
}
} int main() {
scanf("%d%d%d", &n, &m, &q);
REP(i,1,n) REP(j,1,m) {
_ &t = f[has(i,j)];
scanf("%d", &t.v);
t.l=has(i,j-1);
t.r=has(i,j+1);
t.u=has(i-1,j);
t.d=has(i+1,j);
}
REP(i,1,m) {
f[has(0,i)].d=has(1,i);
f[has(n+1,i)].u=has(n,i);
}
REP(i,1,n) {
f[has(i,m+1)].l=has(i,m);
f[has(i,0)].r=has(i,1);
}
REP(i,1,q) {
int a, b, c, d, h, w;
scanf("%d%d%d%d%d%d", &a, &b, &c, &d, &h, &w);
int x = get(a,b), y = get(c,d);
REP(i,1,w) {
swap(f[f[x].u].d,f[f[y].u].d);
swap(f[x].u,f[y].u);
if (i!=w) x = f[x].r, y = f[y].r;
}
REP(i,1,h) {
swap(f[f[x].r].l,f[f[y].r].l);
swap(f[x].r,f[y].r);
if (i!=h) x = f[x].d, y = f[y].d;
}
REP(i,1,w) {
swap(f[f[x].d].u,f[f[y].d].u);
swap(f[x].d,f[y].d);
if (i!=w) x = f[x].l, y = f[y].l;
}
REP(i,1,h) {
swap(f[f[x].l].r,f[f[y].l].r);
swap(f[x].l,f[y].l);
x = f[x].u, y = f[y].u;
}
}
pr();
}