Codeforces Round #367 (Div. 2)E
来源:互联网 发布:通关宝典 软件 编辑:程序博客网 时间:2024/05/17 03:32
题意:
给定一个矩阵,每次操作给出两个子矩阵参数,交换这两个子矩阵,
子矩阵满足:
不相交,没有公共边
要求最后输出这个矩阵
题解:构建四向链表,存每个点上面下面左边右边的点,每次修改就先通过链表找出每个子矩阵的左上角,然后 四条边去瞎搞一通O(N)
#include<iostream>#include<cstdio>#include<queue>#include<vector>#include<bitset>#include<algorithm>#include<cstring>#include<map>#include<stack>#include<set>#include<cmath>#include<ext/pb_ds/priority_queue.hpp>using namespace std;const int maxn = 1010;int n,m,q,num[maxn][maxn],x,y,pos[maxn][maxn],le[maxn*maxn + 4*maxn],ri[maxn*maxn + 4*maxn],up[maxn*maxn + 4*maxn],dw[maxn*maxn + 4*maxn];int getpos(int a,int b){int now = pos[a][0];for (int i = 1; i <= b; i++) now = ri[now];return now;}int Change(int now){x = now/m + 1; if (now % m == 0) --x;y = now%m; if (!y) y = m;}int main(){#ifdef DMCfreopen("DMC.txt","r",stdin);#endifcin >> n >> m >> q;int tot = 0;for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) scanf("%d",&num[i][j]),pos[i][j] = ++tot;for (int i = 1; i <= n; i++) {pos[i][0] = ++tot; pos[i][m+1] = ++tot;for (int j = 1; j <= m; j++) {le[pos[i][j]] = pos[i][j-1];ri[pos[i][j]] = pos[i][j+1];up[pos[i][j]] = pos[i-1][j];dw[pos[i][j]] = pos[i+1][j];}ri[pos[i][0]] = pos[i][1];le[pos[i][m+1]] = pos[i][m];}for (int i = 1; i <= m; i++) {pos[0][i] = ++tot; pos[n+1][i] = ++tot;dw[pos[0][i]] = pos[1][i]; up[pos[1][i]] = pos[0][i];up[pos[n+1][i]] = pos[n][i]; dw[pos[n][i]] = pos[n+1][i];}while (q--) {int A1,B1,A2,B2,h,w;scanf("%d%d%d%d%d%d",&A1,&B1,&A2,&B2,&h,&w);int posA = getpos(A1,B1);int posB = getpos(A2,B2);for (int i = A1,j = A2; i < A1 + h; i++,j++) {swap(ri[le[posA]],ri[le[posB]]);swap(le[posA],le[posB]);posA = dw[posA]; posB = dw[posB]; }posA = up[posA]; posB = up[posB];for (int i = B1,j = B2; i < B1 + w; i++,j++) {swap(up[dw[posA]],up[dw[posB]]);swap(dw[posA],dw[posB]);posA = ri[posA]; posB = ri[posB];}posA = le[posA]; posB = le[posB];for (int i = A1 + h - 1,j = A2 + h - 1; i >= A1; i--,j--) {swap(le[ri[posA]],le[ri[posB]]);swap(ri[posA],ri[posB]);posA = up[posA]; posB = up[posB];}posA = dw[posA]; posB = dw[posB];for (int i = B1 + w - 1, j = B2 + w - 1; i >= B1; i--,j--) {swap(dw[up[posA]],dw[up[posB]]);swap(up[posA],up[posB]);posA = le[posA]; posB = le[posB];} }for (int i = 1; i <= n; i++) {int now = pos[i][0];for (int j = 1; j <= m; j++) {now = ri[now];Change(now);printf("%d ",num[x][y]);}printf("\n");}return 0;}
0 0
- Codeforces Round #367 (Div. 2)E
- Codeforces Round #367 (Div. 2)E
- Codeforces Round #367 (Div. 2) A~E
- Codeforces Round #367 (Div. 2)E. Working routine
- Codeforces Round #367 (Div. 2) E. Working routine
- Codeforces Round #367 (Div. 2) E 十字链表
- Codeforces 405E Codeforces Round #238 (Div. 2)E
- Codeforces Round #103 (Div. 2) E题
- Codeforces Round #147 (Div. 2) E
- Codeforces Round #184 (Div. 2) D、E
- Codeforces Round #197 (Div. 2) (C~E)
- Codeforces Round #102 (Div. 2) //缺E
- Codeforces Round #104 (Div. 2) //缺E
- Codeforces Round #105 (Div. 2) //缺E
- Codeforces Round #103 (Div. 2) //缺E
- Codeforces Round #106 (Div. 2) //缺E
- Codeforces Round #223 (Div. 2) E
- Codeforces Round #229 (Div. 2) E
- Android进程保活招式大全--转自腾讯Bugly
- 【win32】day14-进程/作业/线程
- angularjs记账
- mysql 5.7版本目录无data文件夹的解决办法
- iOS学习-加速计和陀螺仪
- Codeforces Round #367 (Div. 2)E
- MYSQL优化实践
- Java多个线程之间处理共享数据的方式
- 欢迎使用CSDN-markdown编辑器
- 一行代码解决:服务器返回null导致应用崩溃
- AndroidStudio项目关联git远程仓库
- About the IMX6 PCIe Problem
- Webservice
- codeforces367(字符串hash求lcp比较大小,Trie解最大异或问题)