P1188 PASTE

题目描述

我们用文本处理器来处理一个特殊的文本文件,该文本文件共有N行文本,每一行文本仅包含一个自然数,第一行为111、第二行为222,以此类推至N行为自然数NNN。

假设对该文本文件执行一次“剪切和粘贴”操作含义如下:首先选定连续的若干行文本,“剪切”操作将选定的文本从文件中剪下,而“粘贴”操作将剪切下来的文本插入到文件中的其他地方。

编写一个程序求出在进行了连续若干次“剪切和粘贴”操作后,文本文件中前十行的内容。

输入格式

第一行包含两个用空格隔开的自然数NNN和KKK,NNN表示文件的总行数(10≤N≤100,000)(10≤N≤100,000)(10N100,000),K表示“剪切和粘贴”的总次数(1≤k≤1000)(1≤k≤1000)(1k1000)。

下面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)1ABN,0CN(BA+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;
}

猜你喜欢

转载自www.cnblogs.com/mysh/p/11780708.html
今日推荐