数组加下标代替双向链表 但是不知为啥40分TLE
查看原帖
数组加下标代替双向链表 但是不知为啥40分TLE
254745
LZR_BUAA楼主2020/7/27 00:47
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>
#include <string.h>
#include <time.h>
typedef struct node
{
    int l,r,fl;
}Node;
Node list[100001];
//建立一个数组结构,下表为序号 维护时更改是否存在(FLAG)和左右链接标号
// void fun(int n){
//     if((list[n].l==0&&list[n].r==0)||list[n].fl==0) return;
//     if(list[n].l!=0) fun(list[n].l);
//     if(list[n].fl==1) printf("%d ",n);
//     if(list[n].r!=0) fun(list[n].r);
// }

//遍历函数先找到最左端,再一直往右遍历即可
int main(){
    int n,i,k,op,m;
    // for(i=0;i<100001;i++){
    //     list[i].l=list[i].r=0;
    // }
    scanf("%d",&n);
    list[1].fl=1;
    for(i=2;i<=n;i++){
        scanf("%d%d",&k,&op);
        if(op==0){
            list[i].l=list[k].l;
            list[i].r=k;
            list[list[k].l].r=i;
            list[k].l=i;
        }else if(op==1){
            list[i].r=list[k].r;
            list[i].l=k;
            list[list[k].r].l=i;
            list[k].r=i;
        }
        list[i].fl=1;
    }

    // for(i=1;i<=n;i++){
    //     printf("%d %d %d\n",list[i].l,list[i].r,list[i].fl);
    // }    

    scanf("%d",&m);
    for(i=1;i<=m;i++){
        int p;
        scanf("%d",&p);
        list[list[p].r].l=list[p].l;
        list[list[p].l].r=list[p].r;
        list[p].fl=0;
    }

    int st=1;
    while(list[st].l!=0){
        st=list[st].l;
    }
    while(list[st].r!=0){
        if(list[st].fl==0) continue;
        printf("%d ",st);
        st=list[st].r;
    }
    printf("%d\n",st);
    return 0;
}

这还TLE就离谱……按道理数组应该快很多(吧)

2020/7/27 00:47
加载中...