CF刷题总结---CF706E链表
来源:互联网 发布:php博客管理系统源码 编辑:程序博客网 时间:2024/06/14 16:47
这题目应该要秒做出来的。
首先看到二维,又没什么思路就直接降维
考虑一维的情况,就是一段连续的和另一端连续的交换,最快的当然是链表模拟了。所以考虑到二维中也不应该用数组存储,而是链表表示。‘
但是由于二维的话,不可能是简单的链表。所以考虑每一个矩形和旁边的关系。肯定就是四周的,但是只考虑单向,那就是2个方向。就是用一个十字交叉链表表示整个数组,这样的话,如果要交换,就是周围一圈的互相交换就可以了。方法就出来了。这个是典型的类比法,而且就算不用类比,也可以知道使用链表,因为要插入,而不需要查找,这样包括定位,和交换周围的一圈,都只是一个0(n*m)的时间。主要是模拟的过程比较繁琐,也不是太难写,题目还蛮好的。
代码贴一下
#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>#include <vector>using namespace std;#define LL __int64#define ll __int64#define mem(x , y) memset(x , y , sizeof(x))#define lowbit(x) (x&(-x))const ll mod = 1e9+7;const int maxn = 1e5+10 ;struct node{ int l , d ; int val ; node(){ l = -1 , d = -1 ; }}d[1100*1100];int addr(int i , int j){ return i * 1100 + j ;}node * right(node * tmp){ return d + tmp -> l ;}node * down(node * tmp){ return d + tmp -> d ;}void print(node * tmp){ printf("thing : %d %d\n", (tmp - d) / 1100 , (tmp-d) % 1100) ;}void change(node * t1 , node * t2, int h ,int w){ node * tl1 = t1 ; node * tl2 = t2 ; for(int i=0;i<w;i++){ tl1 = d + tl1->l ; tl2 = d + tl2->l ; swap(tl1->d , tl2->d) ; } tl1 = down(tl1) ; tl2 = down(tl2) ; for(int i=0;i<h;i++){ swap(tl1->l , tl2->l) ; tl1 = down(tl1) ; tl2 = down(tl2) ; } tl1 = t1 ; tl2 = t2 ; for(int i=0;i<h;i++){ tl1 = down(tl1) ; tl2 = down(tl2) ; swap(tl1->l , tl2 -> l) ; } tl1 = right(tl1) ; tl2 = right(tl2) ; for(int i=0;i<w;i++){ swap(tl1->d , tl2 -> d) ; tl1 = right(tl1) ; tl2 = right(tl2) ; }}int main(){ int n , m , q; scanf("%d%d%d" , &n,&m,&q) ; for(int i=0;i<=n;i++){ for(int j=0;j<=m;j++) { d[addr(i , j)].l = addr(i , j+1) ; d[addr(i , j)].d = addr(i+1, j) ; } } for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++) { scanf("%d" , &(d[addr(i , j)].val)) ; } } for(int t = 0 ; t < q ; t ++){ int ta,tb,tc,td,th,tw ; scanf("%d%d%d%d%d%d" , &ta,&tb,&tc,&td,&th,&tw) ; node * tmp1 = &d[addr(ta-1 , 0)] ; node * tmp2 = &d[addr(tc-1 , 0)] ; for(int i=0;i<tb-1;i++){ tmp1 = d+tmp1->l ; } for(int i=0;i<td-1;i++){ tmp2 = d+tmp2->l ; } change(tmp1 , tmp2 , th , tw) ; } for(int i=1;i<=n;i++){ node * tmp = d + addr(i , 0) ; for(int j=0;j<m;j++){ tmp = right(tmp) ; printf("%d" , tmp->val) ; if(j == m-1) printf("\n") ; else printf(" ") ; } }}
0 0
- CF刷题总结---CF706E链表
- cf-#163-总结
- CF #190(DIV2)总结
- CF#320 Div.2 总结
- 最近两场cf总结
- CF round 336 div2 总结
- cf(思维题)
- CF
- CF
- cf
- cf
- CF
- CF
- CF
- CF
- CF
- CF
- cf
- Android获取验证码后倒计时
- HTML笔记(一)
- 华为OJ 公共字串计算&&查找两个字符串a,b中的最长公共子串
- python学习(9)———文件操作
- javaee之Struts2辅助功能
- CF刷题总结---CF706E链表
- 利用javadoc定制自己的接口文档(二)
- 107. Binary Tree Level Order Traversal II
- 对简单排序的二次改进
- Android 项目依赖
- HihoCoder]#1362 : 修补木桶
- POJ 2186 Popular Cows Tarjan算法
- 【杭电2063】二分图
- LeetCode: Excel Sheet Column Number