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

京公网安备 11010502036488号