結果
問題 | No.674 n連勤 |
ユーザー |
![]() |
提出日時 | 2024-07-29 00:04:42 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 446 ms / 2,000 ms |
コード長 | 2,352 bytes |
コンパイル時間 | 401 ms |
コンパイル使用メモリ | 82,848 KB |
実行使用メモリ | 115,056 KB |
最終ジャッジ日時 | 2024-07-29 00:04:47 |
合計ジャッジ時間 | 4,552 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 17 |
ソースコード
class UnionFind:def __init__(self,n):self.n = nself.parent_size = [-1]*ndef leader(self,a):if self.parent_size[a] < 0:return aself.parent_size[a] = self.leader(self.parent_size[a])return self.parent_size[a]def merge(self,a,b):x, y = self.leader(a), self.leader(b)if x == y:returnif abs(self.parent_size[x]) < abs(self.parent_size[y]):x, y = y, xself.parent_size[x] += self.parent_size[y]self.parent_size[y] = xreturndef same(self,a,b):return self.leader(a) == self.leader(b)def size(self,a):return abs(self.parent_size[self.leader(a)])def groups(self):result = [[] for _ in range(self.n)]for i in range(self.n):result[self.leader(i)].append(i)return [r for r in result if r != []]N, Q = map(int, input().split())AB = [list(map(int, input().split())) for _ in range(Q)]L = []for A, B in AB:L.append(A)L.append(B)S = sorted(set(L))idx = dict()idxR = dict()for i in range(len(S)):idx[S[i]] = iidxR[i] = S[i]L = len(idx)UF = UnionFind(L)left = list(range(L))right = list(range(L))visited = [False]*Lans = []MAX = 1for A, B in AB:l, r = idx[A], idx[B]visited[l] = Trueif 1 <= l and visited[l-1] and not UF.same(l-1, l) and idxR[l]-idxR[l-1] == 1:nl = left[UF.leader(l-1)]nr = right[UF.leader(l)]UF.merge(l-1, l)left[UF.leader(l)] = nlright[UF.leader(l)] = nrMAX = max(MAX, idxR[right[UF.leader(l)]]-idxR[left[UF.leader(l-1)]]+1)l = right[UF.leader(l)]while l < r:visited[l+1] = Truenl = left[UF.leader(l)]nr = right[UF.leader(l+1)]UF.merge(l, l+1)left[UF.leader(l)] = nlright[UF.leader(l)] = nrl = nrMAX = max(MAX, idxR[right[UF.leader(l)]]-idxR[left[UF.leader(l)]]+1)if r < L-1 and visited[r+1] and not UF.same(r, r+1) and idxR[r+1]-idxR[r] == 1:nl = left[UF.leader(r)]nr = right[UF.leader(r+1)]UF.merge(r, r+1)left[UF.leader(r)] = nlright[UF.leader(r)] = nrMAX = max(MAX, idxR[right[UF.leader(r)]]-idxR[left[UF.leader(r)]]+1)ans.append(MAX)print(*ans, sep="\n")