P1188 PASTE
网页链接
P1188 PASTE
题目描述
我们用文本处理器来处理一个特殊的文本文件,该文本文件共有N NN行文本,每一行文本仅包含一个自然数,第一行为1 11、第二行为2 22,以此类推至N NN行为自然数N NN。
假设对该文本文件执行一次“剪切和粘贴”操作含义如下:首先选定连续的若干行文本,“剪切”操作将选定的文本从文件中剪下,而“粘贴”操作将剪切下来的文本插入到文件中的其他地方。
编写一个程序求出在进行了连续若干次“剪切和粘贴”操作后,文本文件中前十行的内容。
输入格式
第一行包含两个用空格隔开的自然数N NN和K KK,N NN表示文件的总行数( 10 ≤ N ≤ 100 , 000 ) (10≤N≤100,000)(10≤N≤100,000),K KK表示“剪切和粘贴”的总次数( 1 ≤ k ≤ 1000 ) (1≤k≤1000)(1≤k≤1000)。
下面K KK行每一行包含一次“剪切和粘贴”操作的执行信息,每行包含三个用空格隔开自然数A , B , C A,B,CA,B,C,其中1 ≤ A ≤ B ≤ N , 0 ≤ C ≤ N − ( B − A + 1 ) 1≤A≤B≤N,0≤C≤N-(B-A+1)1≤A≤B≤N,0≤C≤N−(B−A+1)。A AA和B BB表示选定文本的第一行和最后一行,C CC表示被剪切下来的文本待插入处的前一行,如果C CC等于0 00则被剪切下来的的文本将被插入到文件的开头。
输出格式
由十行组成,其中包含所有的操作都完成后的文本文件中前十行所包含的数字。
输入输出样例 #1
输入 #1
13 3 6 12 1 2 9 0 10 13 8输出 #1
6 7 8 9 10 11 12 2 3 4解题思路
本题核心是暴力模拟剪切粘贴操作,处理文本行的移动问题。初始数组直接存储1~N代表文本行,利用操作次数K≤1000远小于数据规模N≤1e5的特点,暴力模拟即可高效求解。每次操作先提取[A,B]区间的文本行暂存,根据插入位置C调整数组:插入点在原区间左侧则右移元素,在右侧则左移元素,最后将暂存的文本行回填到目标位置。所有操作完成后,直接输出数组前10个元素,即为最终答案,算法简洁且完全适配题目约束。
总结
核心逻辑:模拟剪切-暂存-移动-回填的流程,完成文本行的剪切粘贴操作。
关键操作:提取剪切区间、数组元素移位、回填暂存数据,最终输出前十行。
效率保障:操作次数仅1000次,暴力模拟无性能压力,适配大数据规模。
代码内容
#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;typedefunsignedlonglongull;typedefvector<vector<ll>>vvt;typedefpair<ll,ll>pll;constll N=1e3+10;constll p=1e9+7;constll INF=1e18;constll M=1e6+10;constintL=100005;intn,k;intd[L],tmp[L];intc;intmain(){for(inti=1;i<L;i++)d[i]=i;cin>>n>>k;for(intop=0;op<k;op++){ints,t,ins,l,a,b;cin>>s>>t>>ins;l=t-s+1;a=ins+1;b=a+l-1;c=0;for(inti=s;i<=t;i++)tmp[++c]=d[i];if(ins<s)for(inti=s-1;i>=a;i--)d[i+l]=d[i];elsefor(inti=t+1;i<=b;i++)d[i-l]=d[i];for(inti=b;i>=a;i--)d[i]=tmp[c--];}for(inti=1;i<=10;i++)cout<<d[i]<<endl;return0;}