实验任务
一条队列呈一字型排列,之后将变换为 W 型。队伍面朝 W 的上端。
数据输入
第一行 N,代表有几个人。(N <= 30000)(人的编号为 1,2…N)
(N = 4k+1(k∈Z+))
接下来 N 行,第 i 行包含一个数字 x,表示 i 号编号的人前面的人编号为 x。
若前方无人,则为零。
数据输出
输出队伍站立为 W 型后每个人前方的人。
若前方无人,则输出零。若有两人,输出两人,编号小的在前,中间用一个
空格隔开。
输入示例
5
0
1
2
3
4
输出示例
0
1 3
0
3 5
0
解题思路
一开始题目理解错了 QAQ。。 以为队列是wwwww…这样排的。。。
结果是整个队列就是【只有一个W】,总人数变动时,W的每条边上的人数会相应变化。
可以把 W 分成 四段来看:
1~P1 \ P1~P2 \ P2~P3 \ P3~P4
其中, 1, P2, P4位置 前方没人;
p1, p3位置 前方两人;
处于区间(1,p1)、(p2,p3) 前方的人 为 原队列前方的人;
(p1,p2)、(p3,p4)前方的人 为 原队列后方的人;
参考代码
#include <stdio.h>
const int maxn = 30010;
struct P{
int r,l;
}que[maxn];
int ans[maxn];
int main()
{
int i,n,p,t;
while (~scanf("%d",&n)){
for (i = 1;i <= n;i++){
scanf("%d",&t);
que[i].l = t,que[t].r = i;
if (!t)
p = i;
}
for (i = 1;i <= n;i++){
ans[i] = p;
p = que[p].r;
}
int len = (n-1) / 4,p1 = 1+len,p2 = 1+2*len,p3 = 1+3*len,p4 = 1+4*len;
for (i = 1;i <= n;i++){
if (i == 1 || i == p2 || i == p4)
que[ans[i]].l = que[ans[i]].r = 0;
else if (i == p1 || i == p3){
que[ans[i]].l = min(a[i-1],a[i+1]);
que[ans[i]].r = max(a[i-1],a[i+1]);
}else if ((i > 1 && i < p1) || (i > p2 && i < p3))
que[ans[i]].l = ans[i-1],que[ans[i]].r = 0;
else
que[ans[i]].l = ans[i+1],que[ans[i]].r = 0;
}
for (i = 1;i <= n;i++){
if (que[i].r)
printf("%d %d\n",que[i].l,que[i].r);
else
printf("%d\n",que[i].l);
}
}
return 0;
}