1. 向编号为
2. 向除了编号为
小红想知道,第几次操作之后,所有盒子里至少都有一个小球,如果一直无法达到这个目标,输出
第一行两个整数和
,表示盒子的数量和操作的次数。
接下来行,每行两个整数
和
,表示第
次操作的类型和
的值。
输出一个整数,表示第几次操作之后,所有盒子里至少都有一个小球,如果一直无法达到这个目标,输出。
3 3 1 1 1 2 1 3
3
三次操作之后,所有盒子里都至少有一个小球。
3 4 1 1 2 2 1 3 1 2
4
第一次操作后,盒子 1 里有小球。第二次操作后,盒子 1、3 里有小球。第三次操作后,盒子 1、3 里有小球。第四次操作后,每个盒子里都有小球。
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(), m = sc.nextInt();
Set<Integer> set = new HashSet<>();
for (int i = 1; i <= n; i++) set.add(i);
int i;
for (i = 1; i <= m; i++) {
if (sc.nextInt() == 1) {
set.remove(sc.nextInt());
if (set.isEmpty()) break;
}
else {
int x = sc.nextInt();
if (!set.contains(x)) break;
set = new HashSet<>();
set.add(x);
}
}
System.out.println(i > m ? -1 : i);
}
}
#include <bits/stdc++.h>
#include <set>
using namespace std;
int m, n, t, x;
const int N = 1e5 + 10;
unordered_set<int> op1, op2;
int main() {
cin >> n >> m;
for (int i = 1; i <= m; i++) {
cin >> t >> x;
if (t == 1) {
op1.insert(x);
if (op1.size() == n) {
cout << i << endl;
return 0;
}
if (op2.find(x) != op2.end()) {
cout << i;
return 0;
}
} else {
op2.insert(x);
if (op2.size() > 1) {
cout << i;
return 0;
}
if (op1.find(x) != op1.end()) {
cout << i;
return 0;
}
}
}
cout << -1;
return 0;
} if __name__ == '__main__': box, times=map(int, input().split()) status=set(range(1,box+1)) sucess=-1 for i in range(times): type, target=map(int, input().split()) if type == 1: if target in status: status.remove(target) else: if len(status) == 1: if target not in status: status.clear() else: for j in range(1,box+1): if j == target: continue if j in status: status.remove(j) if (len(status) == 0) and (sucess == -1): sucess = (i+1) break print(sucess)
n,m = map(int,input().split()) op1 = set() op2 = set() flag = False for k in range(m): t,x = map(int,input().split()) if t == 1 and (x-1) not in op1: op1.add((x-1)) if t == 2 and (x-1) not in op2: op2.add((x-1)) if len(op1)==n&nbs***bsp;len(op2) > 1&nbs***bsp;((x-1) in op1 and (x-1) in op2): flag = True print(k+1) break if not flag: print(-1)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(), m = sc.nextInt();
int[] a = new int[n+5];
int[] b = new int[3];
int[] p = new int[m+5];
int[] x = new int[m+5];
for (int i = 1; i <= m; i++) {
p[i] = sc.nextInt();
x[i] = sc.nextInt();
}
for (int i = 1; i <= m; i++) {
if ((a[x[i]] & p[i]) == 0) {
++b[p[i]];
a[x[i]] |= p[i];
if (b[1] == n || b[2] == 2 || a[x[i]] == 3) {
System.out.print(i);
System.exit(0);
}
}
}
System.out.print(-1);
}
} import java.util.*;
import java.io.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String[] str = bf.readLine().split(" ");
int n = Integer.parseInt(str[0]);
int m = Integer.parseInt(str[1]);
Set<Integer> emptyBox = new HashSet<>();
for(int i=1;i<=n;i++){
emptyBox.add(i);
}
for(int i=0;i<m;i++){
str = bf.readLine().split(" ");
int op = Integer.parseInt(str[0]);
int x = Integer.parseInt(str[1]);
if(op==1){
emptyBox.remove(x);
if(emptyBox.isEmpty()){
System.out.println((i+1));
return;
}
}
else{
if(emptyBox.contains(x)){
emptyBox=new HashSet<>();//这里不要clear,clear会挨个遍历集合元素并移除,时间复杂度高
emptyBox.add(x);
}
else{
//success
emptyBox=new HashSet<>();
System.out.println((i+1));
return;
}
}
}
System.out.println(-1);
}
} 用上面大佬的思路写了个BitSet版本的。
其实这题的数据不大,BitSet没有必要。
import java.util.BitSet;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
BitSet bit1 = new BitSet(n);//至少有一个小球的盒子的集合
int res = 0;
for (int i = 0; i < m; i++) {
res++;
int t = in.nextInt();
int b = in.nextInt();
BitSet bit2 = new BitSet(n);
if (t == 1) {
//如果是1,就把bit1的第b位设置为true
bit1.set(b - 1);
} else {
//如果是2,就把bit2的第b位设置为true
//稍后取反
bit2.set(b - 1);
}
//如果bit2不为0,说明有一个第二种操作,除了bit2中的那一个盒子,别的盒子至少都被放了一个小球
//将bit2取反后就是所有至少有一个小球的盒子,用与操作更新到bit1中。
if (bit2.cardinality() != 0 ) {
bit2.flip(0, n);
bit1.or(bit2);
}
if (bit1.cardinality() == n) {
break;
}
}
System.out.println(bit1.cardinality() == n ? res : -1);
}
} 傻子用二分做的
n, m = map(int, input().split())
ord = []
for _ in range(m):
t, x = map(int, input().split())
ord.append((t, x))
def canSatisfied(mid: int):
diff = [0] * (n + 1)
type1 = set()
for t, x in ord[:mid]:
x -= 1
if t == 1:
type1.add(x)
else:
diff[0] += 1
diff[x] -= 1
diff[x + 1] += 1
diff[n] -= 1
acc = 0
for i in range(n):
acc = acc + diff[i]
if acc == 0 and i not in type1:
return False
return True
l, r = 1, m
while l < r:
mid = (l + r) // 2
if canSatisfied(mid):
r = mid
else:
l = mid + 1
if canSatisfied(l):
print(l)
else:
print(-1)