1. 程式人生 > >中國石油大學天梯賽真題模擬第六場

中國石油大學天梯賽真題模擬第六場

需要 地址 fab pac fix closed 。。 mes 輸出格式

L2-4 鏈表去重 (25 分)

給定一個帶整數鍵值的鏈表 L,你需要把其中絕對值重復的鍵值結點刪掉。即對每個鍵值 K,只有第一個絕對值等於 K 的結點被保留。同時,所有被刪除的結點須被保存在另一個鏈表上。例如給定 L 為 21→-15→-15→-7→15,你需要輸出去重後的鏈表 21→-15→-7,還有被刪除的鏈表 -15→15。

輸入格式:

輸入在第一行給出 L 的第一個結點的地址和一個正整數 N(10?5??,為結點總數)。一個結點的地址是非負的 5 位整數,空地址 NULL 用 -1 來表示。

隨後 N 行,每行按以下格式描述一個結點:

地址 鍵值 下一個結點

其中地址是該結點的地址,鍵值是絕對值不超過10?4??的整數,下一個結點是下個結點的地址。

輸出格式:

首先輸出去重後的鏈表,然後輸出被刪除的鏈表。每個結點占一行,按輸入的格式輸出。

輸入樣例:

00100 5
99999 -7 87654
23854 -15 00000
87654 15 -1
00000 -15 99999
00100 21 23854

輸出樣例:

00100 21 23854
23854 -15 99999
99999 -7 -1
00000 -15 87654
87654 15 -1

訓練時老老實實模擬的鏈表沒過。。。。
技術分享圖片
#include"bits/stdc++.h"

using namespace std;

const int maxn = 1e6 + 1000;
int vis[maxn];

struct node {
    int val, as;
    int last, next;
} e[maxn], d[maxn];
int last = -1;
int rootd = -1;

void del(int id) {
    if (last == -1) {
        last = 0;
        rootd = 0;
        d[
0].val = e[id].val; d[0].next = -1; } else { d[last].next = id; d[id].val = e[id].val; d[id].next = -1; last = id; } e[e[id].last].next = e[id].next; e[e[id].next].last = e[id].last; } void dfs(int now) { if (now == -1) return; if (!vis[e[now].as]) { vis[e[now].as] = 1; dfs(e[now].next); } else { int next = e[now].next; del(now); dfs(next); } } int main() { int root, n; int id, val, next; cin >> root >> n; for (int i = 0; i < n; i++) { cin >> id >> val >> next; e[id].val = val; if (val < 0) val *= -1; e[id].as = val; e[id].next = next; if (next != -1) { e[next].last = id; } } dfs(root); while (root != -1) { if(e[root].next==-1){ printf("%05d %d %d\n", root, e[root].val, e[root].next); }else printf("%05d %d %05d\n", root, e[root].val, e[root].next); root = e[root].next; } while (rootd != -1) { if (d[rootd].next == -1) { printf("%05d %d %d\n", rootd, d[rootd].val, d[rootd].next); } else printf("%05d %d %05d\n", rootd, d[rootd].val, d[rootd].next); rootd = d[rootd].next; } return 0; }
至今不知道為什麽WA的代碼 技術分享圖片
#include"bits/stdc++.h"

using namespace std;

const int maxn = 1e6 + 1000;
struct node {
    int val, next;
} a[maxn];
int b[maxn];
int vis[maxn];

int main() {
    int head, n;
    cin >> head >> n;
    int pos, val, ne;
    for (int i = 0; i < n; i++) {
        cin >> pos >> val >> ne;
        a[pos].val = val;
        a[pos].next = ne;
    }
    printf("%05d %d", head, a[head].val);
    vis[abs(a[head].val)] = 1;
    int t = head;
    int tot = 0;
    while (1) {
        t = a[t].next;
        if (t == -1) {
            printf(" -1\n");
            break;
        }
        int ab = abs(a[t].val);
        if (vis[ab]) {
            b[tot++] = t;
        } else {
            vis[ab] = 1;
            printf(" %05d\n%05d %d", t, t, a[t].val);
        }
    }
    if (tot > 0) {
        printf("%05d %d", b[0], a[b[0]].val);
        for (int i = 1; i < tot; i++) {
            printf(" %05d\n%05d %d", b[i], b[i], a[b[i]].val);
        }
        printf(" -1\n");
    }
    return 0;
}
AC

 

中國石油大學天梯賽真題模擬第六場