CF706E

Solution

这道题感觉可以用差分或者线段树吧,但是没写出来,看了题解是链表。
这是我第一次写链表,感觉挺不错的。

把两个矩形交换,这里可以感性理解为一个网,要把两块网剪下来交换,就是把和四周连接的线剪断,然后重新连上。
这里的这个线就是链表的指针,把它交换一下就好了。

就是把链表初始化,然后每次询问围着矩形一圈交换一下两个矩形边界的指针就好了。

Code

#include<bits/stdc++.h>
using namespace std;
#define y1 yy
using LL=long long;
struct node{
	LL val;
	node *down,*right;
};
node *a[1005][1005];
LL n,m,q,x1,x2,y1,y2,l,c;

int main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	
	cin>>n>>m>>q;
	for(int i=0;i<=n+1;i++) 
		for(int j=0;j<=m+1;j++) 
			a[i][j]=new node();
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			int x;
			cin>>x;
			a[i][j]->val=x;
		}
	}
	for(int i=0;i<=n;i++){
		for(int j=0;j<=m;j++){
			a[i][j]->down=a[i+1][j];
			a[i][j]->right=a[i][j+1];
		}
	}
	
	while(q--){
		cin>>x1>>y1>>x2>>y2>>l>>c;
		node *p1=a[0][0],*p2=a[0][0];
		
		for(int i=1;i<x1;i++) p1=p1->down;
		for(int i=1;i<y1;i++) p1=p1->right;
		
		for(int i=1;i<x2;i++) p2=p2->down;
		for(int i=1;i<y2;i++) p2=p2->right;
		
		node *u1=p1,*u2=p2;
		for(int i=1;i<=c;i++){
			u1=u1->right;
			u2=u2->right;
			swap(u1->down,u2->down);
		}
		for(int i=1;i<=l;i++){
			u1=u1->down;
			u2=u2->down;
			swap(u1->right,u2->right);
		}
		u1=p1,u2=p2;
		for(int i=1;i<=l;i++){
			u1=u1->down;
			u2=u2->down;
			swap(u1->right,u2->right);
		}
		for(int i=1;i<=c;i++){
			u1=u1->right;
			u2=u2->right;
			swap(u1->down,u2->down);
		}
	}
	node *x=a[0][1]->down;
	for(int i=1;i<=n;i++){
		node *y=x;
		for(int j=1;j<=m;j++){
			cout<<y->val<<' ';
			y=y->right;
		}
		cout<<"\n";
		x=x->down;
	}
	return 0;
}