【JZOJ 6551】 Cereal
题目大意:
有 \(n\) 头牛,每头牛喜欢两款麦片,每款麦片只有一份。编号小的牛先选,每头牛先选它最爱的麦片,若没有则选择第二喜欢的,还没有就不吃了。最后问有多少头牛有麦片。
正文:
题目并没有强制在线,虽然可以在线进行操作但是会很麻烦,所以这里考虑从题目中的“移除奶牛”变为“加入奶牛”(即倒着算)。
倒着枚举每头奶牛,如果喜欢的麦片没有被拿走,就直接拿走麦片,否则如果拿走那个麦片的牛的编号要比这头牛的编号要大的话就抢走那个麦片,让原先麦片主去那它第二喜欢的麦片。
代码:
void dfs(int n, int m)
{
if(!vis[m])
{
vis[m] = n;
Ans++;
}else
{
if(vis[m] > n)
{
int y = vis[m];
vis[m] = n;
if(a[y] == m) dfs(y, b[y]);
}
}
}
int main()
{
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; ++i)
scanf ("%d%d", &a[i], &b[i]);
for (int i = n; i >= 1; --i)
{
dfs(i, a[i]);
ans[i - 1] = Ans;
}
for (int i = 0; i < n; ++i)
printf("%d\n", ans[i]);
return 0;
}