萌新求助——一道关于树的搜索题目
  • 板块学术版
  • 楼主bwzhw
  • 当前回复3
  • 已保存回复3
  • 发布时间2021/11/13 00:08
  • 上次更新2023/11/4 00:45:40
查看原帖
萌新求助——一道关于树的搜索题目
582179
bwzhw楼主2021/11/13 00:08

时间:3s,空间:512MB 附上代码: 请问大佬们,如何优化?

//爆空间
#include <stdio.h>
#include <iostream>
#include <vector>
#define N 5000005
using namespace std;
template <class T>
inline bool scan_d(T& ret) {
    char c;
    int sgn;
    if (c = getchar(), c == EOF)
        return 0;  // EOF
    while (c != '-' && (c < '0' || c > '9')) c = getchar();
    sgn = (c == '-') ? -1 : 1;
    ret = (c == '-') ? 0 : (c - '0');
    while (c = getchar(), c >= '0' && c <= '9') ret = ret * 10 + (c - '0');
    ret *= sgn;
    return 1;
}
vector<int> b[N];
int a[N], c[N], d[N], e[N], n;
void f(int i, int son, int k) {
    if (i < 1)
        return;
    while (b[i].size() <= b[son].size() && b[i].size() < k + 1) b[i].push_back(0);
    for (int z = 0; z < b[son].size(); z++) b[i][z + 1] += b[son][z];
    b[i][0] = 1;
    if (d[i] > 0) {
        d[i]--;
    }
    if (d[i] == 0) {
        if (b[i].size() == k + 1)
            e[i] = b[i][k];
        f(a[i], i, k);
    }
}
int main() {
    int k, h, q = 0, l, tag = 1;
    ;
    scan_d(n);
    scan_d(k);
    for (int i = 2; i <= n; i++) {
        scan_d(l);
        a[i] = l;
        c[l]++;
        if (!(tag && q < l))
            tag = 0;
        q = l;
    }
    if (tag) {
        int i = 1;
        for (; i <= n - k; i++) printf("1 ");
        for (; i <= n; i++) printf("0 ");
        return 0;
    }
    for (int i = 1; i <= n; i++) d[i] = c[i];
    for (int i = 1; i <= n; i++)
        if (c[i] == 0) {
            b[i].push_back(1);
            f(a[i], i, k);
        }
    for (int i = 1; i <= n; i++) printf("%d ", e[i]);
    return 0;
}

------------

``````cpp
//爆时间
#include <stdio.h>
#include <vector>
#define N 5000005
using namespace std;
template <class T>
inline bool scan_d(T& ret) {
    char c;
    int sgn;
    if (c = getchar(), c == EOF)
        return 0;  // EOF
    while (c != '-' && (c < '0' || c > '9')) c = getchar();
    sgn = (c == '-') ? -1 : 1;
    ret = (c == '-') ? 0 : (c - '0');
    while (c = getchar(), c >= '0' && c <= '9') ret = ret * 10 + (c - '0');
    ret *= sgn;
    return 1;
}
int b[N], c[N], d[N];
vector<int> a[N];
void f(int i, int k) {
    if (c[i] < k)
        return;
    if (k)
        f(d[i], k - 1);
    else
        b[i]++;
}
void dfs(int i, int k) {
    c[i] = k;
    for (int j = 0; j < a[i].size(); j++) dfs(a[i][j], k + 1);
}
int main() {
    int n, k, l;
    scan_d(n);
    scan_d(k);
    for (int i = 2; i <= n; i++) {
        scan_d(l);
        d[i] = l;
        a[l].push_back(i);
    }
    dfs(1, 0);
    for (int i = 1; i <= n; i++) f(i, k);
    for (int i = 1; i <= n; i++) printf("%d ", b[i]);
    return 0;
}
2021/11/13 00:08
加载中...