W

实验任务

一条队列呈一字型排列,之后将变换为 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;    
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值