P8098 [USACO22JAN] Tests for Haybales G
首先,这是道构造题废话。其中 50 分的部分分可以用差分约束来做(与正解无关)。
经过实践,我们发现题目给的这个
但也还是没那么好想。
我们建立一棵有
这是有多经费不足才画出这种东西(恼)
由于 还是废话。
又根据构造条件,
接下来确定
我们要使得同一层排在后面的节点,
自己的孩子归自己管,别人管不着
我们发现 (逃
(官方样例解释实在太丑,不放了)
由于 不过要注意规定的
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#include<vector>
#define miu 100007
using namespace std;
inline int read() {
register int x = 0; register char ch = getchar();
while(ch < '0' || ch > '9') ch = getchar();
while(ch >= '0' && ch <= '9') {x = x * 10 + ch - 48; ch = getchar();}
return x;
}
struct edge {
int v, nxt;
}e[miu];
int head[miu], eid;
inline void insert(int x, int y) {
e[++eid].v = y; e[eid].nxt = head[x]; head[x] = eid;
}
int ans[miu], d[miu], bonus, n, k;
void dfs(int x) {
ans[x] = bonus--;
for(int i = head[x]; i; i = e[i].nxt) {
int to = e[i].v;
d[to] = d[x] + 1;
dfs(to);
}
}
int suc;
signed main() {
n = read(); k = n + 2; bonus = n + 1;
for(int i = 1; i <= n; ++i) {
suc = read(); insert(++suc, i);
}
dfs(n + 1);
printf("%d\n", k);
for(int i = 1; i <= n; ++i) {
printf("%lld\n", 1ll * k * (d[1] - d[i]) + ans[i]);
}
return 0;
}