結果
| 問題 | No.3390 Public or Private |
| コンテスト | |
| ユーザー |
学ぶマン
|
| 提出日時 | 2026-01-01 16:49:50 |
| 言語 | PyPy3 (7.3.17) |
| 結果 |
AC
|
| 実行時間 | 750 ms / 2,000 ms |
| コード長 | 1,611 bytes |
| 記録 | |
| コンパイル時間 | 329 ms |
| コンパイル使用メモリ | 82,516 KB |
| 実行使用メモリ | 225,464 KB |
| 最終ジャッジ日時 | 2026-01-01 16:50:12 |
| 合計ジャッジ時間 | 21,500 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 27 |
ソースコード
from collections import defaultdict
N, M = map(int, input().split())
# 公開ユーザ数
public_users = N
UV = []
nums = set()
for i in range(M):
u, v = map(int, input().split())
UV.append((u, v))
nums.add(u)
nums.add(v)
Q = int(input())
query = []
for i in range(Q):
q, a, b = map(int, input().split())
nums.add(a)
if b != -1:
nums.add(b)
query.append((q, a, b))
nums = sorted(nums)
dd = defaultdict(int)
for i, n in enumerate(nums):
dd[n] = i
N = len(dd)
# ユーザがフォローしているユーザ一覧
follows = [set() for _ in range(N)]
# 非公開のユーザ
not_public = set()
for u, v in UV:
u = dd[u]
v = dd[v]
follows[u].add(v)
ansl = []
for q, a, b in query:
a = dd[a]
if q == 1:
b = dd[b]
# a の b に対するフォロー状態を切り替える
if b in follows[a]:
follows[a].remove(b)
else:
follows[a].add(b)
else:
# a の公開状態を切り替える
# 非公開ユーザだったら、公開にする
if a in not_public:
not_public.remove(a)
# 公開ユーザが1増える
public_users += 1
else:
not_public.add(a)
public_users -= 1
# 非公開ユーザの中から、a がフォローしているユーザ数を数える
ans = len(not_public & follows[a])
# 公開ユーザ数を追加
ans += public_users
# 自分が公開ユーザなら1減らす
if a not in not_public:
ans -= 1
ansl.append(ans)
print(*ansl, sep='\n')
学ぶマン