-
Notifications
You must be signed in to change notification settings - Fork 1.7k
Expand file tree
/
Copy pathgood-subsequence-queries.py
More file actions
67 lines (62 loc) · 1.77 KB
/
good-subsequence-queries.py
File metadata and controls
67 lines (62 loc) · 1.77 KB
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
# Time: precompute: O(rlog(logr))
# runtime: O(r + (n + q) * log(logr))
# Space: O(rlog(logr) + n)
# number theory, freq table
def precompute(r):
factors = [[] for _ in xrange(r+1)]
curr, k = 1, 0
for i in xrange(2, len(factors)):
if factors[i]:
continue
if curr*i <= r:
curr *= i
k += 1
for j in xrange(i, len(factors), i):
factors[j].append(i)
return factors, k
MAX_NUMS = 50000
FACTORS, K = precompute(MAX_NUMS)
class Solution(object):
def countGoodSubseq(self, nums, p, queries):
"""
:type nums: List[int]
:type p: int
:type queries: List[List[int]]
:rtype: int
"""
if len(nums) == 1:
return 0
curr = [0]
mx = max(max(nums), max(x for _, x in queries))
cnt = [0]*(mx+1)
cnt2 = [0]*(len(nums)+1)
def update(x, d):
if x%p:
return
for q in FACTORS[x//p]:
cnt2[cnt[q]] -= 1
cnt[q] += d
cnt2[cnt[q]] += 1
curr[0] += d
def check():
if curr[0] == 0 or cnt2[curr[0]]:
return False
if curr[0] != len(nums) or len(nums) > K:
return True
for i in xrange(len(nums)):
update(nums[i], -1)
found = (cnt2[curr[0]] == 0)
update(nums[i], +1)
if found:
return True
return False
result = 0
for x in nums:
update(x, +1)
for i, x in queries:
update(nums[i], -1)
nums[i] = x
update(nums[i], +1)
if check():
result += 1
return result