看了一眼大家的思路,誒,怎么都是二分或者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(); }