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
原创粉丝点击