青少年编程知识记录 codecoming

【题解】链表操作

【题目描述】

给定一个N个数的数组,M次操作,每次操作为下列操作之一。求最后的数组。

操作1:在第X个数之后插入一个数Y。

操作2:删除第X个数。

操作3:对区间[XY]进行排序。

操作4:对区间[XY]进行翻转。

操作5:删除区间[XY]中值为Z的数。

【输入描述】

第一行两个整数N,M(N,M≤100000)含义见试题描述。

第二行N个整数,表示原来的数组。

接下来M行,每行第一个数OPT,表示操作类型。

对于操作1,接下来两个数X,Y,含义见题面描述,保证0≤X≤当前数的个数,若X=0,表示在数组开头插入。

对于操作2,接下来一个数X,含义见题面描述,保证1≤X≤当前数的个数。

对于操作3,接下来两个数X,Y,含义见题面描述,保证1≤X≤Y≤当前数的个数,保证操作3不超过10个。

对于操作4,接下来两个数X,Y,含义见题面描述,保证1≤X≤Y≤当前数的个数,保证操作4不超过10个。

对于操作5,接下来三个数X,Y,Z,含义见题面描述,保证1≤X≤Y≤当前数的个数,保证操作5不超过10个。

【输出描述】

输出若干个数,表示最后的数组。

【样例输入】

5 5  1 4 3 2 5  3 2 4  4 4 5  5 2 3 2  5 2 3 1  1 0 9



【样例输出】

9 1 3 5 4



【题目分析】

  1. 不建议使用链表操作,建议使用vector来操作



【参考答案】

#include<bits/stdc++.h>  using namespace std;  int n,m,c,opt,x,y,z;  vector<int> v;  void fun()  {  	for(int i=x-1;i<y;i++)  	{  		if(v[i]==z) v.erase(v.begin()+i);  	}  }  int main()  {  	cin>>n>>m;  	for(int i=1;i<=n;i++)  	{  		cin>>c;  		v.push_back(c);  	}  	for(int i=1;i<=m;i++)  	{  		cin>>opt;  		if(opt==1)  		{  			cin>>x>>y;  			v.insert(v.begin()+x,y);  		}  		if(opt==2)  		{  			cin>>x;  			v.erase(v.begin()+x);  		}  		if(opt==3)  		{  			cin>>x>>y;  			sort(v.begin()+x-1,v.begin()+y);  		}  		if(opt==4)  		{  			cin>>x>>y;  			reverse(v.begin()+x-1,v.begin()+y);  		}  		if(opt==5)  		{  			cin>>x>>y>>z;  			fun();  		}  	}  	for(int i=0;i<v.size();i++) cout<<v[i]<<" ";  	return 0;  }



(adsbygoogle = window.adsbygoogle || []).push({});

作者:亿万年的星光 分类:题解目录 浏览: