結果
| 問題 | No.3390 Public or Private |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-11-15 16:59:28 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 847 ms / 2,000 ms |
| コード長 | 1,839 bytes |
| コンパイル時間 | 387 ms |
| コンパイル使用メモリ | 82,340 KB |
| 実行使用メモリ | 208,916 KB |
| 最終ジャッジ日時 | 2025-11-28 20:53:43 |
| 合計ジャッジ時間 | 20,426 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 27 |
ソースコード
# チャッピーで翻訳
from bisect import bisect_left
def zaatu(P):
N = len(P)
P_copy = P[:]
P_copy.sort()
P_copy2 = []
for x in P_copy:
if not P_copy2 or P_copy2[-1] != x:
P_copy2.append(x)
P_copy = P_copy2
res = []
for i in range(N):
res.append(bisect_left(P_copy, P[i]))
return res
# Step 1: 入力の受け取り
P = [] #クエリに関係ある人
N, M = map(int, input().split())
U = [0] * M
V = [0] * M
for i in range(M):
ui, vi = map(int, input().split())
U[i] = ui
V[i] = vi
P.append(ui)
P.append(vi)
Q = int(input())
query = [None] * Q
for i in range(Q):
a, b, c = map(int, input().split())
query[i] = (a, b, c)
P.append(b)
if c != -1:
P.append(c)
# Step 2: 入力の加工
G = zaatu(P)
mp = {} # ユーザー番号対応表
mp[-1] = -1
for i in range(len(P)):
mp[P[i]] = G[i]
# ユーザー対応表に従って変更開始
for i in range(M):
U[i] = mp[U[i]]
V[i] = mp[V[i]]
q2 = []
for i in range(Q):
a, b, c = query[i]
q2.append((a, mp[b], mp[c]))
query = q2
# Step 3: クエリ解答への準備
S = [set() for _ in range(len(P) + 2)]
for i in range(M):
S[V[i]].add(U[i])
Status = [True] * (len(P) + 2)
Private = set()
# Step 4: クエリへの解答
for i in range(Q):
q, a, b = query[i]
# 操作
if q == 1:
if a in S[b]:
S[b].remove(a)
else:
S[b].add(a)
if q == 2:
if Status[a]:
Status[a] = False
Private.add(a)
else:
Status[a] = True
Private.discard(a)
# 問題への解答
Answer = 0
for p in Private:
if a in S[p]:
Answer += 1
Answer += N - len(Private)
if a not in Private:
Answer -= 1
print(Answer)