-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcontest.py
More file actions
executable file
·169 lines (142 loc) · 4.41 KB
/
contest.py
File metadata and controls
executable file
·169 lines (142 loc) · 4.41 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
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
import collections
import heapq
import math
from functools import cache
from math import gcd
from typing import List, Optional
import sortedcontainers
from sortedcontainers import SortedList
upper = 10 ** 6
def prime_sieve(n):
primes = [True for _ in range(n + 1)]
primes[0] = False
primes[1] = False
limit = int(math.sqrt(n))
for i in range(2, limit + 1):
if primes[i]:
j = 2
while j * i <= n:
primes[j * i] = False
j += 1
ans = [
i for i in range(len(primes)) if primes[i]
]
return ans
#
# primes = set(prime_sieve(upper))
class Solution:
def maxSubarrayLength(self, nums: List[int], k: int) -> int:
left = 0
cnt = collections.defaultdict(int)
freq = sortedcontainers.SortedList()
N = len(nums)
ans = 0
for i in range(N):
freq.discard(cnt[nums[i]])
cnt[nums[i]] += 1
freq.add(cnt[nums[i]])
while len(cnt) > 0 and len(freq) > 0 and freq[-1] > k:
freq.discard(cnt[nums[left]])
cnt[nums[left]] -= 1
freq.add(cnt[nums[left]])
left += 1
ans = max(ans, (i - left + 1))
return ans
class SegTree:
def __init__(self, arr):
self.size = len(arr)
self.segtree = [0 for _ in range(2 * self.size)]
for i in range(self.size, len(self.segtree)):
self.segtree[i] = arr[i - self.size]
for i in range(self.size - 1, -1, -1):
a = self.segtree[2 * i]
b = self.segtree[(2 * i) + 1]
self.segtree[i] = max(a, b)
def queryRange(self, left, right):
left += self.size
right += self.size
ans = 0
while left < right:
if left % 2 == 1:
ans += self.segtree[left]
left += 1
if right % 2 == 1:
right -= 1
ans += self.segtree[right]
left //= 2
right //= 2
return ans
def updateIndex(self, index, value):
index += self.size
self.segtree[index] = value
while index > 1:
index //= 2
a = self.segtree[2 * index]
b = self.segtree[2 * index + 1]
self.segtree[index] = a + b
class LLNode:
def __init__(self, key, value):
self.key = key
self.value = value
self.next = None
self.prev = None
class LinkedList:
def __init__(self):
self.head = None
self.tail = None
self.nodes = collections.OrderedDict()
def add_node(self, node):
node.next = None
node.prev = None
if self.head is None:
self.head = node
self.tail = node
else:
node.prev = self.tail
self.tail.next = node
self.tail = node
self.nodes[node.key] = node
def remove_node(self, node):
if not node.key in self.nodes:
return
if node == self.head:
self.head = self.head.next
if node == self.tail:
self.tail = self.tail.prev
if node.prev is not None:
node.prev.next = node.next
if node.next is not None:
node.next.prev = node.prev
node.next = None
node.prev = None
self.nodes.pop(node.key)
def get_by_key(self, key):
if key in self.nodes:
return self.nodes[key]
return LLNode(-1, -1)
def get_size(self):
return len(self.nodes)
class Trie:
def __init__(self, s=""):
self.trie = {
'wid': ''
}
self.ending_char = '*'
if len(s) > 0:
self.from_str(s)
self.wids = set()
def from_str(self, s):
current = self.trie
prev_wid = ""
for char in s:
if char not in current:
# if prev_wid + char in self.wids:
# print("a")
current[char] = {
'wid': prev_wid + char
}
current = current[char]
prev_wid = current['wid']
# self.wids.add(current['wid'])
current[self.ending_char] = True
current['wid'] = current['wid'] + self.ending_char