1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
| ''' Author: NEFU AB-IN Date: 2024-07-22 19:30:24 FilePath: \LeetCode\2101\2101.py LastEditTime: 2024-07-23 10:22:15 '''
import random from collections import Counter, defaultdict, deque from datetime import datetime, timedelta from functools import lru_cache from heapq import heapify, heappop, heappush, nlargest, nsmallest from itertools import combinations, compress, permutations, starmap, tee from math import ceil, comb, fabs, floor, gcd, hypot, log, perm, sqrt from string import ascii_lowercase, ascii_uppercase from sys import exit, setrecursionlimit, stdin from typing import Any, Dict, List, Optional, Tuple, TypeVar, Union
TYPE = TypeVar('TYPE') N = int(2e5 + 10) M = int(20) INF = int(1e12) OFFSET = int(100) MOD = int(1e9 + 7)
setrecursionlimit(int(2e9))
class Arr: array = staticmethod(lambda x=0, size=N: [x() if callable(x) else x for _ in range(size)]) array2d = staticmethod(lambda x=0, rows=N, cols=M: [Arr.array(x, cols) for _ in range(rows)]) graph = staticmethod(lambda size=N: [[] for _ in range(size)])
class Math: max = staticmethod(lambda a, b: a if a > b else b) min = staticmethod(lambda a, b: a if a < b else b)
class IO: input = staticmethod(lambda: stdin.readline().rstrip("\r\n")) read = staticmethod(lambda: map(int, IO.input().split())) read_list = staticmethod(lambda: list(IO.read()))
class Std: class GraphShortestPath: def __init__(self, n: int): self.n = n self.g = Arr.graph(n) self.spfa_cache = {} self.dijkstra_cache = {} self.floyd_cache = None
def add_edge(self, u: int, v: int, w: int): """Add an edge to the graph.""" self.g[u].append((v, w))
def floyd_01(self) -> List[int]: """Floyd's algorithm for finding reachability between all pairs of nodes using bitwise operations.""" n = self.n f = Arr.array(0, n) for u in range(n): f[u] |= 1 << u for v, w in self.g[u]: f[u] |= 1 << v
for k in range(n): for i in range(n): if f[i] >> k & 1: f[i] |= f[k]
return f
class Bit(int): def __new__(cls, value): return super(Bit, cls).__new__(cls, value)
def __init__(self, value): self.bin_rep = bin(value)[2:]
def bit_length(self): return len(self.bin_rep) def bit_count(self): return self.bin_rep.count('1') def lowest1(self): return Bit(self & -self) def lowest0(self): return Bit(~self & (self + 1)) def clear_lowest1(self): return Bit(self & (self - 1)) def clear_lowest0(self): return Bit(self | (self + 1)) def get_bits(self, start, end): return self & Bit.range_mask(start, end)
all_ones_mask = staticmethod(lambda length: (1 << length) - 1) all_zeros_mask = staticmethod(lambda length: 0) single_bit_mask = staticmethod(lambda position: 1 << position) range_mask = staticmethod(lambda start, end: ((1 << (end - start + 1)) - 1) << start)
class Solution: def maximumDetonation(self, bombs) -> int: def check(bomb_x, bomb_y): _, x1, y1, r1 = bomb_x _, x2, y2, r2 = bomb_y dist = hypot(x2 - x1, y2 - y1) return dist <= r1
n = len(bombs) g = Std.GraphShortestPath(n) bombs = [(i, *bomb) for i, bomb in enumerate(bombs)] for bomb_x, bomb_y in permutations(bombs, 2): if check(bomb_x, bomb_y): g.add_edge(bomb_x[0], bomb_y[0], 0)
dist = g.floyd_01() return max(Bit(s).bit_count() for s in dist)
|