看了一眼大家的思路,誒,怎么都是二分或者map/set

但是好像可以只用数组来解决吧

用a数组来维护操作1只放一个球

用b数组来维护操作2

用check来确定我们是否进行过操作2

用cnt来记录我们已经放入了多少个球

那么该如何判断进行一次操作后是否所有盒子都有球呢?

情况1:

如果没有进行过操作二,那就只需要判断cnt是否等于n即可

情况2

如果进行过操作二:

只需要判断该次操作的x是否与第一次操作二的x相同即可

因为其他地方一定有球的

#include "bits/stdc++.h"

using namespace std;
#define int long long
#define endl "\n"
#define PII pair<int,int>
#define PIII pair<int,PII>
const int MOD = 1e9 + 7;
const int N = 3e5;

void slu() {
    int n, m;
    cin >> n >> m;
    vector<int> a(n + 1, 0);
    vector<int> b(n + 1, 0);
    bool check = false;
    int cnt = 0;
    for (int i = 0; i < m; i++) {
        int choice, x;
        cin >> choice >> x;
        if (choice == 1) {
            if (check) {
                if (b[x]) {
                    cout << ++i;
                    return;
                } else {
                    continue;
                }
            }
            if (!a[x])cnt++;
            a[x] = 1;
        } else {
            if (check) {
                if (b[x])continue;
                else {
                    cout << ++i;
                    return;
                }
            }
            if (b[x]) {
                cout << ++i;
                return;
            } else {
                cnt = n - 1;
                check = true;
                b[x] = 1;
                if (a[x]) {
                    cout << ++i;
                    return;
                }
            }
        }
        if (cnt == n) {
            cout << ++i;
            return;
        }
    }
    cout << -1 << endl;
}

signed main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int T;
//    cin >> T;
    T = 1;
    while (T--)slu();

}