P1188 PASTE
题目描述
我们用文本处理器来处理一个特殊的文本文件,该文本文件共有N行文本,每一行文本仅包含一个自然数,第一行为111、第二行为222,以此类推至N行为自然数NNN。
假设对该文本文件执行一次“剪切和粘贴”操作含义如下:首先选定连续的若干行文本,“剪切”操作将选定的文本从文件中剪下,而“粘贴”操作将剪切下来的文本插入到文件中的其他地方。
编写一个程序求出在进行了连续若干次“剪切和粘贴”操作后,文本文件中前十行的内容。
输入格式
第一行包含两个用空格隔开的自然数NNN和KKK,NNN表示文件的总行数(10≤N≤100,000)(10≤N≤100,000)(10≤N≤100,000),K表示“剪切和粘贴”的总次数(1≤k≤1000)(1≤k≤1000)(1≤k≤1000)。
下面KKK行每一行包含一次“剪切和粘贴”操作的执行信息,每行包含三个用空格隔开自然数A,B,CA,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)。AAA和BBB表示选定文本的第一行和最后一行,CCC表示被剪切下来的文本待插入处的前一行,如果CCC等于000则被剪切下来的的文本将被插入到文件的开头。
输出格式
由十行组成,其中包含所有的操作都完成后的文本文件中前十行所包含的数字。
输入输出样例
输入 #1
13 3 6 12 1 2 9 0 10 13 8
输出 #1
6 7 8 9 10 11 12 2 3 4
思路
简单字符串插入移动处理
将一段文本剪切下来粘到另一段文本后面,相当于将这两段文本交换
使用tmp数组记录下剪切下的文本,将另一段文本向前(插入行在原文本第一行之后)或向后(插入行在原文本第一行之前)。
将tmp数组里的数赋值到该粘贴的位置就可以了。
代码
#include<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int N=100010; int n,k,cnt; int doc[N],tmp[N]; int main () { for(int i=1; i<=N; i++) doc[i]=i; scanf("%d%d",&n,&k); for(int j=0; j<k; j++) { int s,t,p1,p2,ins,len; scanf("%d%d%d",&s,&t,&ins); len=t-s+1; p1=ins+1; p2=p1+len-1; cnt=0; for(int i=s; i<=t; i++) tmp[++cnt]=doc[i]; if(ins<s) for(int i=s-1; i>=p1; i--) doc[i+len]=doc[i]; else for (int i=t+1; i<=p2; i++) doc[i-len]=doc[i]; for(int i=p2; i>=p1; i--) doc[i]=tmp[cnt--]; } for(int i=1; i<=10; i++) printf("%d\n",doc[i]); return 0; }