时间: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;
}