近日,在FJ的牛棚里发生了一件暴力事件。罪犯已被确定为Bessie……(Luogu P6282)

………………………………
奶牛抢食时间.jpg
送门!

思路

正难则反!!!
从最后一头奶牛开始往前,让它吃它最喜欢的。
那如果最喜欢的被吃了呢?
把这箱麦片抢过来,被抢的吃第二喜欢的。(因为在那头奶牛前面)
这样,我们就可以边遍历边统计了。
注意抢的时候答案不用加 $ 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;
}

现在博主越来越懒了……

posted @ 2022-10-10 21:44  A-Problem-Solver  阅读(56)  评论(0编辑  收藏  举报