結果
問題 | No.1914 Directed by Two Sequences |
ユーザー |
|
提出日時 | 2021-10-31 18:48:52 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 3,204 bytes |
コンパイル時間 | 389 ms |
コンパイル使用メモリ | 82,040 KB |
実行使用メモリ | 219,824 KB |
最終ジャッジ日時 | 2024-12-16 01:17:11 |
合計ジャッジ時間 | 48,544 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 WA * 1 |
other | WA * 38 |
ソースコード
class SegmentTree:def __init__(self, init_val, segfunc, ide_ele):n = len(init_val)self.segfunc = segfuncself.ide_ele = ide_eleself.num = 1 << (n - 1).bit_length()self.tree = [ide_ele] * 2 * self.numself.size = nfor i in range(n):self.tree[self.num + i] = init_val[i]for i in range(self.num - 1, 0, -1):self.tree[i] = self.segfunc(self.tree[2 * i], self.tree[2 * i + 1])def update(self, k, x):k += self.numself.tree[k] = xwhile k > 1:k >>= 1self.tree[k] = self.segfunc(self.tree[2*k], self.tree[2*k+1])def query(self, l, r):if r==self.size:r = self.numres = self.ide_elel += self.numr += self.numright = []while l < r:if l & 1:res = self.segfunc(res, self.tree[l])l += 1if r & 1:right.append(self.tree[r-1])l >>= 1r >>= 1for e in right[::-1]:res = self.segfunc(res,e)return resdef solve(N,A,B,M,E):A = [a-1 for a in A]B = [b-1 for b in B]res = set()edge = [[] for v in range(N)]for u,v in E:edge[u-1].append(v-1)edge[v-1].append(u-1)group = [-1 for v in range(N)]for v in range(N):mex = [False for i in range(len(edge[v])+1)]for nv in edge[v]:if nv < v and group[nv] < len(mex):mex[group[nv]] = Truefor i in range(len(mex)):if not mex[i]:group[v] = ibreakn = max(group) + 1clique = [[] for g in range(n)]for v in range(N):clique[group[v]].append(v)def direct(i,j):if i < j:return A[i] < B[j]else:return B[i] < A[j]def hamilton_path(V):n = len(V)if n <= 1:return VA = hamilton_path(V[:n//2])B = hamilton_path(V[n//2:])res = []bi = 0for ai in range(len(A)):while bi<len(B) and direct(B[bi],A[ai]):res.append(B[bi])bi += 1res.append(A[ai])res += B[bi:]return residx = [-1 for v in range(N)]for g in range(n):clique[g] = hamilton_path(clique[g])for i in range(len(clique[g])):idx[clique[g][i]] = ifor u,v in zip(clique[g],clique[g][1:]):res.add((u,v))if 5*10**4 <= N:import randomE = set(E)while len(res) < 7 * 10**5:u = random.randint(1,N-1)v = random.randint(u+1,N)if (u,v) in E:continueif direct(u-1,v-1):res.add((u-1,v-1))else:res.add((v-1,u-1))print(len(res))for u,v in res:print(u+1,v+1)import sysinput = lambda :sys.stdin.buffer.readline()mi = lambda :map(int,input().split())li = lambda :list(mi())N,M = mi()A = li()B = li()E = [tuple(mi()) for i in range(M)]solve(N,A,B,M,E)