NC222501. [USACOOpen2020S]Cereal
描述
输入描述
The first line contains two space-separated integers N and M.
For each 1≤i≤N, the i-th line contains two space-separted integers fi and si (1≤fi,si≤M and fi≠si) denoting the favorite and second-favorite cereals of the i-th cow in line.
输出描述
For each 0≤i≤N−1, print a line containing the answer for i.
示例1
输入:
4 2 1 2 1 2 1 2 1 2
输出:
2 2 2 1
说明:
If at least two cows remain, then exactly two of them get a box of cereal.C++ 解法, 执行用时: 183ms, 内存消耗: 2600K, 提交时间: 2021-09-17 18:19:21
#include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false), cin.tie(0); int N, M; cin >> N >> M; vector<int> f(N), s(N), used(M + 1), ans(N); for (int i = 0; i < N; i++) cin >> f[i] >> s[i]; for (int i = N - 1, cnt = 0; i >= 0; i--) { for (int j = i, x = f[i]; true;) { int &u = used[x]; // j要吃x if (u == 0) { // x还在,直接吃 u = j, cnt++; break; } if (u < j) break; // 不能跟更靠前的人抢 int k = u; // 谁吃的? u = j; // 吐出来,给j吃。 if (x == s[k]) break; // k是第二选择吃的x吐出来 j = k, x = s[k]; // 让k试试第2选择 } ans[i] = cnt; } for (int i = 0; i < N; i++) cout << ans[i] << endl; }