2421 序列操作

http://codevs.cn/problem/2421/

2010年省队选拔赛四川

 
题目描述 Description

lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1,现在对于这个序列有五种变换操作和询问操作:

0 a b 把[a, b]区间内的所有数全变成0

1 a b 把[a, b]区间内的所有数全变成1

2 a b 把[a,b]区间内的所有数全部取反,也就是说把所有的0变成1,把所有的1变成0

3 a b 询问[a, b]区间内总共有多少个1

4 a b 询问[a, b]区间内最多有多少个连续的1

对于每一种询问操作,lxhgww都需要给出回答,聪明的程序员们,你们能帮助他吗?

输入描述 Input Description

输入数据第一行包括2个数,n和m,分别表示序列的长度和操作数目

第二行包括n个数,表示序列的初始状态

接下来m行,每行3个数,op, a, b,(0<=op<=4,0<=a<=b<n)表示对于区间[a, b]执行标号为op的操作

输出描述 Output Description

对于每一个询问操作,输出一行,包括1个数,表示其对应的答案

样例输入 Sample Input

10 10

0 0 0 1 1 0 1 0 1 1

1 0 2

3 0 5

2 2 2

4 0 4

0 3 6

2 3 7

4 2 8

1 0 5

0 5 6

3 3 9

样例输出 Sample Output

5

2

6

5

数据范围及提示 Data Size & Hint

对于30%的数据,1<=n, m<=1000

对于100%的数据,1<=n, m<=100000

线段树

题目AC四步走

第一步:TLE 50分

代码中线段树均使用2n空间方法建树

维护信息:

0的个数sum_0,1的个数sum_1,  连续的0的个数con_0,  连续的1的个数con_1;
左端点连续0的个数l_0,  右端点连续0的个数r_0,  左端点连续1的个数l_1,  右端点连续1的个数r_1;
懒标记f,f=-1表示区间无标记,=0表示区间有一个全部更新为0的标记没有下穿,=1同理;

操作0,1:线段树基本的区间修改

操作2:可以一直递归到一个区间都是0或都是1时在操作,也相当于区间修改

操作3:线段树基本的区间查询

操作4:类似于求GSS的查询过程,在更新l_0,r_0,l_1,r_1时稍有不同,要先判断是否包括整个左右子区间

TLE 原因:多余的标记下传

1、标记下穿时,没有必要保证子节点的标记也下传了,因为有效标记只有两种,0,1,而且是对整个区间完全覆盖,所以多个标记只有最后一个有效

2、区间取反时,没有必要保证本区间标记下传,因为如果原来区间标记是0,意思是子区间要变为0,区间取反后区间标记是1,意思是子区间要变为1,与原来标记是什么无关。

第二步:AC 100分,总时间耗费: 881ms    总内存耗费: 11 MB

将导致TLE的3行删去

#include<cstdio>
#include<algorithm>
using namespace std;
struct node
{
int l,r;
int sum_0,sum_1,con_0,con_1,sum;
int l_0,r_0,l_1,r_1;
int f;
}e[];
int n,m,cnt,x,p,a,b,anss;
void change(int,int);
inline void up(int k)
{
int l=k+,r=k+e[k+].sum*;
e[k].sum_0=e[l].sum_0+e[r].sum_0;
e[k].sum_1=e[l].sum_1+e[r].sum_1;
e[k].con_0=max(max(e[l].con_0,e[r].con_0),e[l].r_0+e[r].l_0);
e[k].con_1=max(max(e[l].con_1,e[r].con_1),e[l].r_1+e[r].l_1);
if(e[l].con_0==e[l].sum) e[k].l_0=e[l].sum+e[r].l_0;
else e[k].l_0=e[l].l_0;
if(e[r].con_0==e[r].sum) e[k].r_0=e[r].sum+e[l].r_0;
else e[k].r_0=e[r].r_0;
if(e[l].con_1==e[l].sum) e[k].l_1=e[l].sum+e[r].l_1;
else e[k].l_1=e[l].l_1;
if(e[r].con_1==e[r].sum) e[k].r_1=e[r].sum+e[l].r_1;
else e[k].r_1=e[r].r_1;
}
inline void all_0(int k)
{
e[k].sum_0=e[k].con_0=e[k].l_0=e[k].r_0=e[k].sum;
e[k].sum_1=e[k].con_1=e[k].l_1=e[k].r_1=;
}
inline void all_1(int k)
{
e[k].sum_1=e[k].con_1=e[k].l_1=e[k].r_1=e[k].sum;
e[k].sum_0=e[k].con_0=e[k].l_0=e[k].r_0=;
}
inline void down(int k)
{
if(e[k].l==e[k].r) return;
int l=k+,r=k+e[k+].sum*;
//if(e[l].f!=-1) down(l); TLE
//if(e[r].f!=-1) down(r); TLE
if(!e[k].f)
{
all_0(l);all_0(r);
e[l].f=e[r].f=;
}
else
{
all_1(l);all_1(r);
e[l].f=e[r].f=;
}
e[k].f=-;
}
inline void judge(int k)
{
//if(e[k].f!=-1) down(k); TLE
if(e[k].sum_0==e[k].sum)
{
all_1(k);
e[k].f=;
}
else if(e[k].sum_1==e[k].sum)
{
all_0(k);
e[k].f=;
}
else
{
judge(k+);
judge(k+e[k+].sum*);
}
if(e[k].f!=-) down(k);
if(e[k].l!=e[k].r) up(k);
}
inline void change(int k,int g)
{
if(e[k].l>=a&&e[k].r<=b)
{
if(!g) { all_0(k); e[k].f=; }
else if(g==) { all_1(k); e[k].f=; }
else if(g==) { judge(k); }
else if(g==) { anss+=e[k].sum_1; }
return;
}
if(e[k].f!=-) down(k);
int mid=e[k].l+e[k].r>>;
if(a<=mid) change(k+,g);
if(b>mid) change(k+e[k+].sum*,g);
up(k);
}
inline void build(int l,int r)
{
cnt++;
int h=cnt;
e[cnt].l=l;e[cnt].r=r;
e[cnt].sum=r-l+;
e[cnt].f=-;
if(l==r)
{
scanf("%d",&x);
if(x) { e[cnt].sum_1=e[cnt].con_1=e[cnt].l_1=e[cnt].r_1=; }
else { e[cnt].sum_0=e[cnt].con_0=e[cnt].l_0=e[cnt].r_0=; }
return;
}
int mid=l+r>>;
build(l,mid);build(mid+,r);
up(h);
}
inline void ask(int k,int & ans,int & ans_l,int & ans_r)
{
int l=k+,r=k+e[k+].sum*;
if(e[k].l>=a&&e[k].r<=b)
{
ans=e[k].con_1;
ans_l=e[k].l_1;
ans_r=e[k].r_1;
return;
}
if(e[k].f!=-) down(k);
int mid=e[k].l+e[k].r>>;
if(b<=mid) ask(l,ans,ans_l,ans_r);
else if(a>mid) ask(r,ans,ans_l,ans_r);
else
{
int lch_ans,lch_l_1,lch_r_1,rch_ans,rch_l_1,rch_r_1;
ask(l,lch_ans,lch_l_1,lch_r_1);
ask(r,rch_ans,rch_l_1,rch_r_1);
ans=max(lch_ans,rch_ans);
ans=max(ans,lch_r_1+rch_l_1);
if(e[l].con_1==e[l].sum) ans_l=max(lch_l_1,e[l].sum+rch_l_1);
else ans_l=lch_l_1;
if(e[r].con_1==e[r].sum) ans_r=max(rch_r_1,e[r].sum+lch_r_1);
else ans_r=rch_r_1;
}
}
int main()
{
scanf("%d%d",&n,&m);
build(,n-);
int ans,ans_l,ans_r;
for(int i=;i<=m;i++)
{
scanf("%d%d%d",&p,&a,&b);
switch(p)
{
case :change(,);break;
case :change(,);break;
case :change(,);break;
case :anss=,change(,),printf("%d\n",anss);break;
case :ask(,ans,ans_l,ans_r),printf("%d\n",ans);
}
}
}

第三步:去掉多余信息    总时间耗费: 683ms  总内存耗费: 6 MB

老师讲课时提到要维护0的信息,是因为操作2可以直接交换0和1的信息来完成

但自己做的时候操作2不是这样实现的,所以0的信息不用维护

#include<cstdio>
#include<algorithm>
using namespace std;
struct node
{
int l,r;
int sum_1,con_1,sum;
int l_1,r_1;
int f;
}e[];
int n,m,cnt,x,p,a,b,anss;
void change(int,int);
inline void up(int k)
{
int l=k+,r=k+e[k+].sum*;
e[k].sum_1=e[l].sum_1+e[r].sum_1;
e[k].con_1=max(max(e[l].con_1,e[r].con_1),e[l].r_1+e[r].l_1);
if(e[l].con_1==e[l].sum) e[k].l_1=e[l].sum+e[r].l_1;
else e[k].l_1=e[l].l_1;
if(e[r].con_1==e[r].sum) e[k].r_1=e[r].sum+e[l].r_1;
else e[k].r_1=e[r].r_1;
}
inline void all_0(int k)
{
e[k].sum_1=e[k].con_1=e[k].l_1=e[k].r_1=;
}
inline void all_1(int k)
{
e[k].sum_1=e[k].con_1=e[k].l_1=e[k].r_1=e[k].sum;
}
inline void down(int k)
{
if(e[k].l==e[k].r) return;
int l=k+,r=k+e[k+].sum*;
if(!e[k].f)
{
all_0(l);all_0(r);
e[l].f=e[r].f=;
}
else
{
all_1(l);all_1(r);
e[l].f=e[r].f=;
}
e[k].f=-;
}
inline void judge(int k)
{
if(!e[k].sum_1)
{
all_1(k);
e[k].f=;
}
else if(e[k].sum_1==e[k].sum)
{
all_0(k);
e[k].f=;
}
else
{
judge(k+);
judge(k+e[k+].sum*);
}
if(e[k].f!=-) down(k);
if(e[k].l!=e[k].r) up(k);
}
inline void change(int k,int g)
{
if(e[k].l>=a&&e[k].r<=b)
{
if(!g) { all_0(k); e[k].f=; }
else if(g==) { all_1(k); e[k].f=; }
else if(g==) { judge(k); }
else if(g==) { anss+=e[k].sum_1; }
return;
}
if(e[k].f!=-) down(k);
int mid=e[k].l+e[k].r>>;
if(a<=mid) change(k+,g);
if(b>mid) change(k+e[k+].sum*,g);
up(k);
}
inline void build(int l,int r)
{
cnt++;
int h=cnt;
e[cnt].l=l;e[cnt].r=r;
e[cnt].sum=r-l+;
e[cnt].f=-;
if(l==r)
{
scanf("%d",&x);
if(x) { e[cnt].sum_1=e[cnt].con_1=e[cnt].l_1=e[cnt].r_1=; }
return;
}
int mid=l+r>>;
build(l,mid);build(mid+,r);
up(h);
}
inline void ask(int k,int & ans,int & ans_l,int & ans_r)
{
int l=k+,r=k+e[k+].sum*;
if(e[k].l>=a&&e[k].r<=b)
{
ans=e[k].con_1;
ans_l=e[k].l_1;
ans_r=e[k].r_1;
return;
}
if(e[k].f!=-) down(k);
int mid=e[k].l+e[k].r>>;
if(b<=mid) ask(l,ans,ans_l,ans_r);
else if(a>mid) ask(r,ans,ans_l,ans_r);
else
{
int lch_ans,lch_l_1,lch_r_1,rch_ans,rch_l_1,rch_r_1;
ask(l,lch_ans,lch_l_1,lch_r_1);
ask(r,rch_ans,rch_l_1,rch_r_1);
ans=max(lch_ans,rch_ans);
ans=max(ans,lch_r_1+rch_l_1);
if(e[l].con_1==e[l].sum) ans_l=max(lch_l_1,e[l].sum+rch_l_1);
else ans_l=lch_l_1;
if(e[r].con_1==e[r].sum) ans_r=max(rch_r_1,e[r].sum+lch_r_1);
else ans_r=rch_r_1;
}
}
int main()
{
scanf("%d%d",&n,&m);
build(,n-);
int ans,ans_l,ans_r;
for(int i=;i<=m;i++)
{
scanf("%d%d%d",&p,&a,&b);
switch(p)
{
case :change(,);break;
case :change(,);break;
case :change(,);break;
case :anss=,change(,),printf("%d\n",anss);break;
case :ask(,ans,ans_l,ans_r),printf("%d\n",ans);
}
}
}

第四步:换方法   操作2按上面说的实现

然而代码越改越长,空间越勇越大,时间越用越多,却并没有AC

这道题耗了1天了,时间不允许了,日后再改吧

#include<cstdio>
#include<algorithm>
using namespace std;
struct node
{
int l,r;
int sum_0,sum_1,con_0,con_1,sum;
int l_0,r_0,l_1,r_1;
int f;
bool f2;
}e[];
int n,m,cnt,x,p,a,b,anss;
void change(int,int);
inline void up(int k)
{
int l=k+,r=k+e[k+].sum*;
e[k].sum_0=e[l].sum_0+e[r].sum_0;
e[k].sum_1=e[l].sum_1+e[r].sum_1;
e[k].con_0=max(max(e[l].con_0,e[r].con_0),e[l].r_0+e[r].l_0);
e[k].con_1=max(max(e[l].con_1,e[r].con_1),e[l].r_1+e[r].l_1);
if(e[l].con_0==e[l].sum) e[k].l_0=e[l].sum+e[r].l_0;
else e[k].l_0=e[l].l_0;
if(e[r].con_0==e[r].sum) e[k].r_0=e[r].sum+e[l].r_0;
else e[k].r_0=e[r].r_0;
if(e[l].con_1==e[l].sum) e[k].l_1=e[l].sum+e[r].l_1;
else e[k].l_1=e[l].l_1;
if(e[r].con_1==e[r].sum) e[k].r_1=e[r].sum+e[l].r_1;
else e[k].r_1=e[r].r_1;
}
inline void all_0(int k)
{
e[k].sum_0=e[k].con_0=e[k].l_0=e[k].r_0=e[k].sum;
e[k].sum_1=e[k].con_1=e[k].l_1=e[k].r_1=;
}
inline void all_1(int k)
{
e[k].sum_1=e[k].con_1=e[k].l_1=e[k].r_1=e[k].sum;
e[k].sum_0=e[k].con_0=e[k].l_0=e[k].r_0=;
}
inline void judge(int k)
{
swap(e[k].con_0,e[k].con_1);
swap(e[k].sum_0,e[k].sum_1);
swap(e[k].l_0,e[k].l_1);
swap(e[k].r_0,e[k].r_1);
if(e[k].l!=e[k].r) {e[k].f=;e[k].f2=true;}
}
void ww(int l)
{
if(e[l].l==e[l].r) judge(l);
else if(e[l].f==) {e[l].f=;e[l].f2=false;}
else if(e[l].f==) {e[l].f=;e[l].f2=false;}
else if(e[l].f==) e[l].f=-;
else judge(l);
}
inline void down(int k)
{
if(e[k].l==e[k].r) return;
int l=k+,r=k+e[k+].sum*;
if(!e[k].f)
{
all_0(l);all_0(r);
if(e[l].l!=e[l].r)
{
e[l].f=e[r].f=;
e[l].f2=e[r].f2=true;
} }
else if(e[k].f==)
{
all_1(l);all_1(r);
if(e[k].l!=e[k].r)
{
e[l].f=e[r].f=;
e[r].f2=e[l].f2=true;
} }
else
{
ww(l);
ww(r);
if(e[k].l!=e[k].r) up(k);
}
e[k].f=-;
}
inline int mm(int k)
{
if(e[k].f==-) return e[k].sum_1;
if(e[k].f2==true) return e[k].sum_1;
if(e[k].f==) return ;
if(e[k].f==) return e[k].sum;
if(e[k].f==) return e[k].sum_0;
}
inline void change(int k,int g)
{
if(e[k].l>=a&&e[k].r<=b)
{
if(!g)
{
all_0(k);
if(e[k].l!=e[k].r) e[k].f=;
}
else if(g==)
{
all_1(k);
if(e[k].l!=e[k].r) e[k].f=;
}
else if(g==) { ww(k); }
else if(g==) { anss+=mm(k); }
return;
}
if(e[k].f!=-) down(k);
int mid=e[k].l+e[k].r>>;
if(a<=mid) change(k+,g);
if(b>mid) change(k+e[k+].sum*,g);
up(k);
}
inline void build(int l,int r)
{
cnt++;
int h=cnt;
e[cnt].l=l;e[cnt].r=r;
e[cnt].sum=r-l+;
e[cnt].f=-;
e[cnt].f2=true;
if(l==r)
{
scanf("%d",&x);
if(x) { e[cnt].sum_1=e[cnt].con_1=e[cnt].l_1=e[cnt].r_1=; }
else { e[cnt].sum_0=e[cnt].con_0=e[cnt].l_0=e[cnt].r_0=; }
return;
}
int mid=l+r>>;
build(l,mid);build(mid+,r);
up(h);
}
inline void ask(int k,int & ans,int & ans_l,int & ans_r)
{
int l=k+,r=k+e[k+].sum*;
if(e[k].l>=a&&e[k].r<=b)
{
if(e[k].f2==true)
{
ans=e[k].con_1;
ans_l=e[k].l_1;
ans_r=e[k].r_1;
}
else
{
ans=e[k].con_0;
ans_l=e[k].l_0;
ans_r=e[k].r_0;
}
return;
}
if(e[k].f!=-) down(k);
int mid=e[k].l+e[k].r>>;
if(b<=mid) ask(l,ans,ans_l,ans_r);
else if(a>mid) ask(r,ans,ans_l,ans_r);
else
{
int lch_ans,lch_l_1,lch_r_1,rch_ans,rch_l_1,rch_r_1;
ask(l,lch_ans,lch_l_1,lch_r_1);
ask(r,rch_ans,rch_l_1,rch_r_1);
ans=max(lch_ans,rch_ans);
ans=max(ans,lch_r_1+rch_l_1);
if(e[l].con_1==e[l].sum) ans_l=max(lch_l_1,e[l].sum+rch_l_1);
else ans_l=lch_l_1;
if(e[r].con_1==e[r].sum) ans_r=max(rch_r_1,e[r].sum+lch_r_1);
else ans_r=rch_r_1;
}
}
int main()
{
scanf("%d%d",&n,&m);
build(,n-);
int ans,ans_l,ans_r;
for(int i=;i<=m;i++)
{
scanf("%d%d%d",&p,&a,&b);
switch(p)
{
case :change(,);break;
case :change(,);break;
case :change(,);break;
case :anss=,change(,),printf("%d\n",anss);break;
case :ask(,ans,ans_l,ans_r),printf("%d\n",ans);
}
}
}

错误代码

第一步中出现的错误

1、第一次提交RE

2、第二次提交10分,找出RE的错误:down函数里区间标记下传时,没有判断是否到了叶子节点。因为2*n的空间建树,没有节点浪费,但也没有了多余的节点,4*空间建树可以不用判断

3、第三次提交10分,找出部分错误:down函数里区间标记下传时,只更改了子区间的0,1信息,忘了更改懒标记

4、第四次提交TLE50分,找出所有错误:judge函数区间取反时,

①没有在每次取反后标记下传,

如果本区间全是0或1,当然要下传标记。

如果本区间不全是0或1,那区间没有标记,就不需要下穿,又因为没有标记是-1,下传会导致错误,所以 ③要先判断是否需要下传标记

②没有对区间修改后的区间信息合并,线段树的修改操作改完要合并信息,又因为2*n的空间建树,所以要 ④先判断是否是叶子节点再合并。change函数里不需要判断叶子节点,是因为到达的叶子节点一定属于操作区间,在合并之前会return

第四步做了一上午,交了10遍,全是10分,放弃,O| ̄|_

错误全部集中在down、和取反两个函数里,而down函数只写过求和和最大值的标记,取反函数第一次写,其余函数以前写过,没有错误

SCOI2010 序列操作的更多相关文章

  1. bzoj 1858: [Scoi2010]序列操作

    1858: [Scoi2010]序列操作 Time Limit: 10 Sec  Memory Limit: 64 MB 线段树,对于每个区间需要分别维护左右和中间的1和0连续个数,并在op=4时特殊 ...

  2. BZOJ 1858: [Scoi2010]序列操作( 线段树 )

    略恶心的线段树...不过只要弄清楚了AC应该不难.... ---------------------------------------------------------------- #inclu ...

  3. bzoj1858[Scoi2010]序列操作 线段树

    1858: [Scoi2010]序列操作 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 3079  Solved: 1475[Submit][Statu ...

  4. BZOJ_1858_[Scoi2010]序列操作_线段树

    BZOJ_1858_[Scoi2010]序列操作_线段树 Description lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1,现在对于这个序列有五种变换操作和询 ...

  5. 【题解】Luogu P2572 [SCOI2010]序列操作

    原题传送门:P2572 [SCOI2010]序列操作 这题好弱智啊 裸的珂朵莉树 前置芝士:珂朵莉树 窝博客里对珂朵莉树的介绍 没什么好说的自己看看吧 操作1:把区间内所有数推平成0,珂朵莉树基本操作 ...

  6. P2572 [SCOI2010]序列操作

    对自己 & \(RNG\) : 骄兵必败 \(lpl\)加油! P2572 [SCOI2010]序列操作 题目描述 lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要 ...

  7. BZOJ1858 [Scoi2010]序列操作(线段树)

    题目链接 [Scoi2010]序列操作 考验代码能力的一道好题. 思想还是很简单的(直接上线段树),但是比较难写. #include <bits/stdc++.h> using names ...

  8. (WAWAWAWAWAWA) BZOJ 1858: [Scoi2010]序列操作

    二次联通门 : BZOJ 1858: [Scoi2010]序列操作 /* BZOJ 1858: [Scoi2010]序列操作 已经... 没有什么好怕的的了... 16K的代码... 调个MMP啊.. ...

  9. 1858: [Scoi2010]序列操作

    1858: [Scoi2010]序列操作 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 3397 Solved: 1624 [Submit][Statu ...

随机推荐

  1. 【BZOJ1010】【HNOI2008】玩具装箱(斜率优化,动态规划)

    [BZOJ1010][HNOI2008]玩具装箱 题面 题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一 ...

  2. 【BZOJ3626】LCA(树链剖分,Link-Cut Tree)

    [BZOJ3626]LCA(树链剖分,Link-Cut Tree) 题面 Description 给出一个n个节点的有根树(编号为0到n-1,根节点为0).一个点的深度定义为这个节点到根的距离+1. ...

  3. 在不同环境下MD5加密相同字符串,密文不一样的问题

    这是昨天做一个接口对接时遇到的一个问题.下面是md5加密的算法 public static String md555(String plainText) throws UnsupportedEncod ...

  4. OOP面向对象程序设计

    1.对象:程序中描述现实中一个物体的属性和功能的结构 面向对象的程序设计,即为定义相应对象的属性,实现相应的功能.一个对象专门代表现实中的一个物体. *封装事物的属性和功能的结构. 例如 我们的手机: ...

  5. 小米google play service停止工作解决办法,不root,不刷第三方recovery(也适用于其他的手机)

    问题: 原因是手机安卓系统是6.0.系统应用里面没有包含谷歌框架等一系列谷歌的小东西. 参考: http://www.miui.com/thread-3548436-1-1.html http://w ...

  6. WebCracker4.0和monster字典——路由器登陆密码破解工具

    路由器登陆密码破解,很伤cpu的

  7. hidden symbol `pthread_atfork'

    gcc交叉编译时发生这种错误 /.. .../voice_demo: hidden symbol `pthread_atfork' in /opt/gcc-linaro-aarch64-linux-g ...

  8. 微信公众号开发 VS2015本地调试

    1.部署一个微信公众号服务在本地IIS: 2.下载一个ngrok 穿网工具,放到部署文件夹根目录: ngrok穿网 在部署路径下打开cmd,输入 ngrok http [端口号] 4.将映射的URL ...

  9. IOS开发之XCode学习014:警告对话框和等待提示器

    此文学习来源为:http://study.163.com/course/introduction/1002858003.htm 此工程文件实现功能:  1.警告对话框和等待提示器的概念 2.警告对话框 ...

  10. JAVA实现双向链表的增删功能

    JAVA实现双向链表的增删功能,完整代码 package linked; class LinkedTable{ } public class LinkedTableTest { //构造单链表 sta ...