Luogu P1160 【队列安排】

详细的链表讲解

很明显的一个链表裸题

和普通的链表有一个区别就是这个题

可以O(1)插入,O(1)查询

然后我们为了方便,采用双向链表,定义s、f作为指针数组

更详细的解释见代码

#include<iostream>
using namespace std;
const int maxn=1e5+10;
int n,m,cnt,s[maxn],f[maxn],fi;
int main()
{
    cin>>n;
    for(int i=2;i<=n;i++)
    {
        int k,p;
        cin>>k>>p;
        if(!p)    //插入到左边
        {
            s[i]=k;        //更新被影响的节点的指针
            f[i]=f[k];
            s[f[k]]=i;
            f[k]=i;
        }
        else    //插入到右边
        {
            f[i]=k;
            s[i]=s[k];
            f[s[k]]=i;
            s[k]=i;
        }
    }
    cin>>m;
    while(m--)    //删除
    {
        int x;
        cin>>x;
        if(f[x]==-1)
            continue;
        f[s[x]]=f[x];
        s[f[x]]=s[x];
        f[x]=s[x]=-1;
    }
    for(int i=1;i<=n;i++)    //寻找头指针
        if(!f[i])
        {
            fi=i;
            break;
        }
    for(int i=fi;i;i=s[i])        //输出链表
        cout<<i<<' ';
    cout<<endl;
    return 0;
}

 

posted @ 2018-05-18 19:57  Ivanovcraft  阅读(156)  评论(0编辑  收藏  举报