0.链表(暑假)题解

A. 数组-删除某个数

时间:0.2 空间:32M

题目描述:

在给定的数组中删除一个数

输入格式:

多组测试,每组测试包含三行:第一行是一个整数表示数组的大小n,第二行是n个整数,第三行是要求删除的数字m。

输出格式:

删除在第二行n个整数中第一次出现数字m并删除,然后按照顺序输出剩下的数

样例输入1:

4 1 2 3 4 3

样例输出1:

1 2 4

样例输入2:

5 6 5 2 1 7 9 7 2 5 5 2 4 7 6 2

样例输出2:

6 5 2 1 7 5 5 2 4 7 6

提示:

1≤n≤100

m有可能在原数组中找不到,找不到则输出原数组

	while(cin>>?){
		flag=true;
		for(int i=1;i<=n;i++)cin>>a[i];
		cin>>?;
		for(int i=1;i<=?;i++){
			if(a[i]==m){
				if(flag){
					?=false;
				}
				else{
					cout<<?<<" ";
				}
			}
			else cout<<?<<" ";
		}
		cout<<"?";
	}

水题,不用讲

B. 双链表

时间:1s 空间:256M
题目描述:
实现一个双链表,双链表初始为空,支持5种操作:

1.在最左侧插入一个数;

2.在最右侧插入一个数;

3.将第k个插入的数删除;

4.在第k个插入的数左侧插入一个数;

5.在第k个插入的数右侧插入一个数;

现在要对该链表进行M次操作,进行完所有操作后,从左到右输出整个链表。

注意:题目中第k个插入的数并不是指当前链表的第k个数。例如操作过程中一共插入了n个数,

则按照插入的时间顺序,这n个数依次为:第一个插入的数,第二个插入的数,…第n个插入的数。

输入格式:
第一行包含整数M,表示操作次数。

接下来M行,每行包含一个操作命令,操作命令可能为以下几种:

1.L x,表示在链表的最左端插入数x。

2.R x,表示在链表的最右端插入数x。

3.D k,表示将第k个插入的数删除。

4.IL k x,表示在第k个插入的数左侧插入一个数。

5.IR k x,表示在第k个插入的数右侧插入一个数。

输出格式:
共一行,将整个链表从左到右输出。

数据范围:

1 ≤ M ≤ 100000

所有操作保证合法。

样例输入:

10
R 7
D 1
L 3
IL 2 10
D 3
IL 2 7
L 8
R 9
IL 4 7
IR 2 2

样例输出:

8 7 7 3 2 9

模板题要记

void init()
{
    r[0] = 1, l[1] = 0;
    idx = 2;
}
void add(int k, int x)
{
    e[idx] = x;
    r[idx] = r[k];
    l[idx] = k;
    l[r[k]] = idx;
    r[k] = idx;
    idx ++ ;
}
void del(int k)
{
    r[l[k]] = r[k];
    l[r[k]] = l[k];
}

C. 加强保密
时空限制:1S,64MB
问题描述:
为了加强保密,我们不能再使用一整串联系序列了!现在我们使用一个多组单线联系的关系,来构造整个联系表。构造方法如下。

先将 1 号特工安排进联系表,这时表中只有他一个人;

2−N 号特工依次加入联系表,代号为 i 的特工联系方式为:指定代号为 i 的特工是代号为 1∼(i−1) 中某位特工(即之前已经在联系表的特工)的上级或下级;

在所有特工的联系关系按照上述方法建立完毕后,就形成了新的联系表。

输入格式
第 1 行为一个正整数 N,表示了有 N 个同学。

第 2−N 行,第 i 行包含两个整数 k,p,其中 k 为小于 i 的正整数,p 为 0 或者 1。若 p 为 0,则表示将 i 号特工是 k 号特工的上级,p 为 1 则表示是下级。

输出格式
1 行,包含 N 个空格隔开的正整数,表示了联系表从上到下所有特工的代号。

输入输出样例
输入

4
1 0
2 1
1 0

输出

2 3 4 1

说明/提示
样例解释:
特工 2 是特工 1 的上级,此时联系表为:

2 1

特工 3 是特工 2 的下级,此时联系表为:

2 3 1

特工 4 是特工 1 的上级,此时联系表为:

2 3 4 1

数据范围
对于 20% 的数据,有 N≤10;

对于 40% 的数据,有 N≤1000;

对于 100% 的数据,有 N≤100000。

上题略加改编即可

add(0,1);

for(int i=2;i<=n;i++){
    int op,k;
    cin >> k>>op;
	if(op==1)add(k+1,i);
	else if(op==0)add(l[k+1],i);
}
for (int i = r[0]; i != 1; i = r[i]) cout << e[i] <<  ' ';
4 个赞

dalao好棒啊

1 个赞