开学cf补题(第三周)

发布时间 2023-09-19 14:47:37作者: 畴

首先复习一下暑假学的链表

826. 单链表 - AcWing题库   题目

代码都有注释,直接看即可

#include <bits/stdc++.h>
//#pragma  GCC optimize("Ofast")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>
//#define double long double
#define int long long
//#define endl '\n';
using namespace std;
const int N=1e5+7,M=1e1;
const int INF = 0x3f3f3f3f;
const int mod=100003;
typedef pair<int,int> PII;

int e[N];//存储每一个需要插入的值
int en[N*2]; //存next值  就是向后的引索
int idx;  //一个下标值用来开新的空间存插入的元素
int head=-1; //一开始的头时-1,这样遍历到尾巴就可以跳出

void  add(int x)  //在头的地方加入新的元素
{
    e[idx]=x;  //存新加入的元素
    en[idx]=head;  //  把新元素的下一个next值指向原来的头
    head=idx;  // 更新现在的头元素
    idx++;  //  加加给下一个新数组开空间
}

void ea(int k) //输出k后面的一个元素
{
    en[k]=en[en[k]];  // 把k元素的指针指向下下一个元素,直接跳过k+1元素,注意下标,因为是从0开始的
}

void in(int k,int x)  // 在第k个元素后面插入x
{
    e[idx]=x;  //存新的元素
    en[idx]=en[k];  //  把新的元素指向k的下一个元素
    en[k]=idx;  //  把k元素指向刚插入的新元素
    idx++;
}
void solve()
{
    int m;
    cin>>m;
    while (m--)
    {
        char c;
        cin>>c;
        if(c=='H')
        {
            int x;
            cin>>x;
            add(x);
        }
        if(c=='D')
        {
            int k;
            cin>>k;
            if (k == 0) head = en[head];
            else
            ea(k-1); //注意删除第k个输入后面的数,那函数里放的是下标,k要减去1,因为你是从0开始的
        }
        if(c=='I')
        {
            int k,x;
            cin>>k>>x;
            in(k-1,x);
        }
    }
    for(int i=head;i!=-1;i=en[i])  // 遍历
    {
        cout<<e[i]<<" ";
    }
}


signed main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    int T=1;
//    cin>>T;
    while(T--){
        solve();
    }
    return 0;
}

然后呢就是通过链表实现的拓扑排序

这个东西可以检查是否自环