近日,在FJ的牛棚里发生了一件暴力事件。罪犯已被确定为Bessie……(Luogu P6282)
………………………………
传送门!
思路
正难则反!!!
从最后一头奶牛开始往前,让它吃它最喜欢的。
那如果最喜欢的被吃了呢?
把这箱麦片抢过来,被抢的吃第二喜欢的。(因为在那头奶牛前面)
这样,我们就可以边遍历边统计了。
注意抢的时候答案不用加 $ 1 $ ,因为是这头牛来替换被抢的牛。
代码
#include <bits/stdc++.h>
using namespace std;
int f[100005], s[100005], hv[100005];
int true_ans[100005];
int ans = 0;
void solve(int x, int y) {
if (hv[y] == -1) { // 没有被吃
hv[y] = x;
ans++; // 答案 +1
} else if (hv[y] > x) { // 被吃了
int z = hv[y];
hv[y] = x; // 抢过来
if (y == f[z]) { // 退而求其次
solve(z, s[z]);
}
}
}
int main() {
memset(hv, -1, sizeof hv);
int n, m;
scanf("%d %d", &n, &m);
for (int i = 0; i < n; i++) {
scanf("%d %d", &f[i], &s[i]);
}
for (int i = n - 1; i >= 0; i--) {
solve(i, f[i]); // 边遍历边统计
true_ans[i] = ans;
}
for (int i = 0; i < n; i++) {
printf("%d\n", true_ans[i]);
}
return 0;
}
现在博主越来越懒了……