题解 P1188 【PASTE】

· · 题解

此题解使用链表做法,不难理解。

思路:

  1. 就是用链表将剪切部分前一行的指针指向剪切部分后一行;

  2. 将粘贴的地方前一行的指针指向剪切部分最开始的那行;

  3. 然后将剪切部分尾部那行的指针指向原本粘贴位置的前一行的后一行;

  4. 最后再从第一行开始输出到第十行就可以了。

    代码如下:

    #include<bits/stdc++.h>
    using namespace std;
    int n,m,t,a[100005],gdd,gddd,pd,ppd,ans1,ans2;
    //制造链表!
    struct dd{
    int nr;
    int zh;
    }zz[100005]; 
    int main() {
    cin>>n>>m;
    zz[0].zh=1;
    for(int i=1;i<=n-1;i++){
        zz[i].nr=i;
        zz[i].zh=i+1;
    }
    zz[n].nr=n;
    zz[n].zh=0;
    for(int i=1;i<=m;i++){
        int q,z,h,jl1=0,jl2=0,jl3=0;
        cin>>q>>z>>h;
        int gx=zz[0].zh;
        if(h>=q) h+=z-q+1;
        for(int j=1;gx;j++){
            //这三个重要位置找到就记录下来!
            if(j==q-1) jl1=gx;
            if(j==z){
                jl2=gx;
                if(jl1&&jl3) break;
            }
            if(j==h){
                jl3=gx;
                if(jl1&&jl2) break;
            }
            gx=zz[gx].zh;
        }
        //指针指向改变
        int jjl=zz[jl1].zh;
        zz[jl1].zh=zz[jl2].zh;
        zz[jl2].zh=zz[jl3].zh;
        zz[jl3].zh=jjl;
    }
    int gt=zz[0].zh;
    //输出!
    for(int i=1;i<=9;i++){
        cout<<zz[gt].nr<<endl;
        gt=zz[gt].zh;
    }
    //最后一行不用换行,虽然换了也可以但是有些强迫呀
    cout<<zz[gt].nr;
    return 0;
    }