列表

详情


NC222501. [USACOOpen2020S]Cereal

描述

Farmer John's cows like nothing more than cereal for breakfast! In fact, the cows have such large appetites that they will each eat an entire box of cereal for a single meal.
The farm has recently received a shipment with M different types of cereal (1≤M≤105) . Unfortunately, there is only one box of each cereal! Each of the N cows (1≤N≤105) has a favorite cereal and a second favorite cereal. When given a selection of cereals to choose from, a cow performs the following process:

If the box of her favorite cereal is still available, take it and leave.
Otherwise, if the box of her second-favorite cereal is still available, take it and leave.
Otherwise, she will moo with disappointment and leave without taking any cereal.
The cows have lined up to get cereal. For each 0≤i≤N−1, determine how many cows would take a box of cereal if Farmer John removed the first i cows from the line.

输入描述

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;
}

上一题