2 条题解

  • 0
    @ 2024-4-24 20:24:51

    前置:本题解使用的是手搓链表

    思路

    链表板子题,主要考察链表的插入删除以及维护头部。

    AC Code

    千万千万要注意:输入数据时下标要从2开始!

    #include<bits/stdc++.h>
    #define ll long long
    using namespace std;
    const ll N=1e5+5;
    ll n,head=1,m;
    struct stu{
        ll pre=0,next=0;
    }a[N];
    bool flag[N];
    int main(){
        scanf("%lld",&n);
        for(ll i=2,k,p;i<=n;i++){ // 下标要从2开始
            scanf("%lld%lld",&k,&p);
            if(p){
                a[i].pre=k;
                a[i].next=a[k].next;
                a[a[k].next].pre=i;
                a[k].next=i;
            }else{
                if(k==head)
                    head=i;
                a[i].next=k;
                a[i].pre=a[k].pre;
                a[a[k].pre].next=i;
                a[k].pre=i;
            }
        }
        scanf("%lld",&m);
        for(ll i=1,x;i<=m;i++){
            scanf("%lld",&x);
            if(!flag[x]){
                if(x==head)
                    head=a[x].next;
                flag[x]=1;
                a[a[x].pre].next=a[x].next;
                a[a[x].next].pre=a[x].pre;
            }
        }
        while(a[head].next)
            printf("%lld ",head),head=a[head].next;
        printf("%lld",head);
        return 0;
    }
    
    
    • 0
      @ 2024-4-13 11:05:13
      #include <list>
      #include <cstdio>
      #include <cstring>
      
      #define N 100007
      
      using namespace std;
      
      int main(){
          list<int > rander;
          list<int >::iterator pos[N];
      
          int n, m;
          bool vis[100007];
      
          scanf("%d",&n);
          memset(vis, 1, sizeof(vis));
      
          rander.push_front(1);
          pos[1]=rander.begin();
      
          for (int i = 2; i < n+1; i++) {
              int k, p;
              scanf("%d %d",&k, &p);
      
              if (p) pos[i] = rander.insert(next(pos[k]),i);
              else pos[i] = rander.insert(pos[k],i);
          }
      
          scanf("%d",&m);
          for (int i = 0; i < m; i++) {
              int temp;
              scanf("%d",&temp);
              if (vis[temp]){
                  rander.erase(pos[temp]);
                  vis[temp] = false;
              }
          }
      
          for (list<int>::iterator it = rander.begin(); it != rander.end(); it++) {
              if (it == rander.begin())printf("%d", *it);
              else printf(" %d", *it);
          }
          return 0;
      }
      
      • 1

      信息

      ID
      714
      时间
      1000ms
      内存
      125MiB
      难度
      4
      标签
      递交数
      122
      已通过
      59
      上传者